Django DRF ModelSerializer 对不属于模型中的字段进行验证的解决方法

示例的序列化器

class AddFlowBodySerializer(serializers.ModelSerializer, BaseModelSerializer):
    approval_flow = serializers.IntegerField(label='审批流ID') # 该字段是不属于 FlowBody 模型
    class Meta:
        model = FlowBody # 模型
        exclude = ('deleted','object_flow','user',)
        validators = [UniqueTogetherValidator(queryset=FlowBody.objects.all(), fields=['abstract',], message='该摘要已经存在')]

    def validate(self, attrs):
        attrs['user'] = self.context['request'].user
        approval_flow = ApprovalFlow.objects.filter(id=attrs['approval_flow']).first()
        if not approval_flow:
            raise serializers.ValidationError("审批流不存在")
        # 动态创建一个 objectflow
        objectflow = ObjectFlow(name=approval_flow.name)
        objectflow.save()
        attrs['object_flow'] = objectflow
        # 删除掉 不属于 FlowBody 模型的字段
        del attrs['approval_flow']
        return attrs

示例的viewset视图

# 审批主体 ModelViewSet视图
class FlowBodyViewset(ModelViewSet):
    '''
    修改局部数据
    create:  创建审批主体
    retrieve:  检索某个审批主体
    update:  更新审批主体
    destroy:  删除审批主体
    list:  获取审批主体列表
    '''
    queryset = FlowBody.objects.all().order_by('-updated')
    authentication_classes = (JWTAuthentication,)
    permission_classes = [BaseAuthPermission, ]
    throttle_classes = [VisitThrottle]
    serializer_class = ReturnFlowBodySerializer
    filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter,)
    search_fields = ('abstract', 'content', )
    filter_fields = ('user', 'object_flow', )
    ordering_fields = ('updated', 'sort_time', 'created',)
    pagination_class = Pagination

    def get_serializer_class(self):
        if self.action == 'create':
            return AddFlowBodySerializer
        if self.action == 'update' or self.action == 'partial_update':
            return UpdateFlowBodySerializer
        return ReturnFlowBodySerializer

    def get_queryset(self):
        if bool(self.request.auth) and self.request.user.group_id == 1:
            return FlowBody.objects.all().order_by('-updated')
        else:
            return FlowBody.objects.filter(user_id=self.request.user.id).order_by('-updated')
            
    # 重写create方法,让在创建成功后的approval_flow不返回
    def create(self, request, *args, **kwargs):
        print('查看data:', request.data)
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        flowbody = FlowBody.objects.filter(abstract=request.data.get('abstract')).first()
        json_data = ReturnFlowBodySerializer(flowbody).data
        return Response(json_data, status=status.HTTP_201_CREATED)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值