Вызов для проверки поля модели в сериализаторе - PullRequest
0 голосов
/ 03 апреля 2020

Я попытаюсь проверить уникальность поля на уровне проверки в сериализаторе и не могу понять, почему валидатор вообще не вызывается.

models.py

class Vendor(models.Model):
    active = models.BooleanField(default=False)
    ...

class VendorContacts(models.Model):
    vendor = models.ForeignKey('Vendors', related_name='contacts', on_delete=models.CASCADE)
    email = models.CharField(max_length=80, blank=True, null=True)
    .....

serializer.py

class VendorContactCreateSerializer(serializers.ModelSerializer):
    email = serializers.CharField(validators=[RegexValidator(regex=r'[^@]+@[^\.]+\..+',
                                                             message='Enter valid email address')])
    vendor = serializers.PrimaryKeyRelatedField(queryset=Vendors.objects.all(), required=False, allow_null=True)

    class Meta:
        model = VendorContacts
        fields = (.....
                  )

    def create(self, validated_data):
        .....
        #some logic

    def validate_email(self, value):
        print('Start validation')
        exist_contact = VendorContacts.objects.filter(email=value)
        if exist_contact:
            vc = get_object_or_404(VendorContacts, email=value)
            v = vc.vendor
            if v.active:
                raise serializers.ValidationError('Email {} already exists'.format(value))
        return value

В приведенном выше сериализаторе я выполняю проверку на уровне поля модели def validate_email(). print('Start validation') не называется. Я пытался сделать то же самое на уровне объекта через def validate():, но он тоже не вызывается.

UPD

views.py

class VendorContactsCreateView(APIView):

    permission_classes = [permissions.AllowAny, ]
    serializer_class = VendorContactCreateSerializer

    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = VendorContactCreateSerializer(data=data)
        try:
            serializer.is_valid(raise_exception=True)
            serializer.save()
        except ValidationError:
            return Response({"errors": (serializer.errors,)},
                            status=status.HTTP_400_BAD_REQUEST)

        else:
            return Response(request.data, status=status.HTTP_200_OK)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...