Как задать пользовательский ответ на ошибку при проверке сериализатора в проекте Django?
Я работаю над проектом Django. Я определил пользовательскую модель User, используя класс AbstractBaseModel. Ниже приведено представление моей модели для наглядности.
# models.py
class User(AbstractBaseUser):
id = models.AutoField(primary_key=True)
firstname = models.CharField(max_length=50)
lastname = models.CharField(max_length=50)
email = models.EmailField(unique=True)
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
is_staff = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['firstname', 'lastname']
objects = UserManager()
def save(self, *args, **kwargs):
if not self.firstname or not self.lastname or not self.email or not self.password:
raise ValueError('All required fields must be provided')
super().save(*args, **kwargs)
def __str__(self):
return str(self.id) + '. ' + self.firstname + ' ' + self.lastname + ' (' + self.email + ')'
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return True
class Meta:
db_table = 'users'
verbose_name = 'User'
verbose_name_plural = 'Users'
Ниже представлен мой класс сериализатора, который служит для валидации объекта User при его создании.
# serializers.py
from rest_framework import serializers
from .models import *
from django.contrib.auth.hashers import make_password, check_password
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['firstname', 'lastname', 'email', 'password']
def create(self, validated_data):
user = User.objects.create_user(
email = validated_data['email'],
firstname = validated_data['firstname'],
lastname = validated_data['lastname'],
password = make_password(validated_data['password'])
)
return user
Также обратитесь к моему представлению, которое создает объект пользователя для наглядности.
# views.py
from .models import *
from .serializers import *
from rest_framework.response import Response
from rest_framework.views import APIView
class UserSignup(APIView):
def post(self, request):
serializer = UserSerializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=400)
serializer.save()
return Response(serializer.data, status=201)
Здесь, как вы могли заметить, мое поле email уникально, и при создании пользователя с дублированным email мой сериализатор выдает следующий подтвержденный ответ.
{
"email": [
"User with this email already exists."
]
}
Моя проблема заключается в том, что я хочу иметь пользовательский ответ от валидации сериализатора. Есть способ добавить метод validate в класс сериализатора для добавления моей пользовательской проверки, но здесь проблема будет заключаться в добавлении проверки для всех моих полей, если я хочу добавить пользовательскую проверку только для поля email.
Как правильно изменить только пользовательский вывод для сообщения об ошибке сериализатора, срабатывающего при дублировании поля электронной почты?
Например, мне нужен следующий вывод для вставки дублирующего письма.
{
"email": [
"Email already exists."
]
}
Как мне достичь вышеуказанного?
email = serializers.EmailField(
validators=[UniqueValidator(queryset=User.objects.all(), message={"email" : ["custom msg"]})]
)
Думаю, вы ищете что-то вроде UniqueValidator и UniqueTogetherValidator, которые принимают запрос для проверки, а второй аргумент будет вашим недостающим фрагментом