Для запуска проверок необходимо вызвать serializer.is_valid()
, однако для этого требуется, чтобы данные передавались в сериализатор, а не в экземпляры. Логика заключается в том, что drf проверяет поступающие данные, а не данные, уже сохраненные в вашей БД
Правильная логика
Соображения
Похоже, вы реализуете представление списка, но вы проверяете адрес электронной почты, что, вероятно, не то, что вы намеревались сделать в первую очередь. Я думаю, вы хотите проверить электронную почту при создании.
Вы можете использовать общие представления и миксины drf, такие как GenericViewSet
, ListModelMixin
и ListModelMixin
Я думаю, у вас есть тип в validate_emailplus
, где вы пытаетесь get
поле email
, в то время как сериализатор объявляет его как emailplus
Вы, похоже, не следуете PEP-8 (руководство по стилю для Python)
serializers.py
import re
import phonenumbers
from rest_framework import serializers
from phonenumbers import carrier
from validate_email import validate_email
class BasicSerializer(serializers.Serializer):
emailplus = serializers.EmailField()
country = serializers.CharField(max_length=2)
phone_number = serializers.CharField(max_length=100)
def validate_emailplus(self):
email = self.validated_data.get("emailplus")
if not validate_email(email, check_mx=True, verify=True):
raise serializers.ValidationError("Invalid email")
return email
views.py
from rest_framework import mixins, viewsets
class BasicViewSet(
viewsets.GenericViewSet,
mixins.ListModelMixin,
mixins.CreateModelMixin,
):
queryset = Basic.objects.all()
serializer_class = BasicSerializer
Для лучшего понимания того, как работают viewset и mixins, я рекомендую проверить их реализацию
Проверка на сайте администратора
Со скриншотаВы добавили, похоже, что вы пытаетесь проверить на сайте администратора, для этого рассмотрим следующий код:
models.py
class Basic(models.Model):
...
def clean(self):
if not validate_email(self.email, check_mx=True, verify=True):
raise ValidationError("Invalid email")
Это работает, потому что администратор Django генерирует формы на основеваши модели, а затем формы вызывают full_clean()
на модели, которая вызывает clean()