首页 > 解决方案 > 为什么 DRF 跳过验证?

问题描述

我有一个这样的验证器:(是的,它是空的并引发异常)

class AlphanumericValidator(object):
    def __init__(self):
        pass

    def __call__(self, value):
        raise serializers.ValidationError(
            'Value should contain only letters, numbers, - and _ characters.'
        )

和序列化器:

class CampaignSerializer(CreatorModelSerializer):
    name = serializers.CharField(max_length=32, validators=[
        AlphanumericValidator()
    ])
    class Meta:
        model = Campaign
        fields = ('id', 'name')
        validators = [
            UniqueTogetherValidator(
                queryset=Campaign.objects.all(),
                fields=['account', 'name'],
                message='A campaign with this name is already exists.',
            ),
        ]

我的有效载荷:

id: 5
name: "aaq???asdas"

我的观点:

class CampaignDetailView(APIView):
    permission_classes = (IsOwner, )

    def get_object(self, request, campaign_pk):
        campaign = get_object_or_404(Campaign, pk=campaign_pk)
        self.check_object_permissions(request, campaign)
        return campaign

    def put(self, request, campaign_pk):
        campaign = self.get_object(request, campaign_pk)
        serializer = CampaignSerializer(
            campaign,
            data=request.data,
            context={
                'request': request,
            }
        )
        if serializer.is_valid(raise_exception=True):
            serializer.save()

        return Response(
            serializer.data,
        )

权限所有者:

class IsOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return request.user.profile.account == obj.account

序列化程序正在成功验证名称。

我的错误在哪里?

编辑:我忘了添加 CampaignDetailSerializer.put 方法的结尾。我添加了它们。

标签: djangodjango-rest-frameworkdjango-views

解决方案


我最疯狂的猜测是,您使用自定义验证器的方式应该与 一起使用ModelViewSet,以触发这些验证器。

如果您正在做一些自定义的事情,请尝试覆盖上的validate方法ModelSerializer

像下面这样

# I guess that CreatorModelSerializer is a sub-class of ModelSerializer.
class CampaignSerializer(CreatorModelSerializer):
    def validate(self, attrs):
        # Do Validations
        if True:
            raise serializers.ValidationError(
                'ABBBBALIIIZA'
            )
        # Otherwise return the attributes
        return attrs

    class Meta:
        model = Campaign
        fields = ('id', 'name')
        validators = [
            UniqueTogetherValidator(
                queryset=Campaign.objects.all(),
                fields=['account', 'name'],
                message='A campaign with this name is already exists.',
            ),
        ]

在此更改之后,验证应该可以正常工作。


推荐阅读