"Это поле не может быть пустым". Django DRF

Я новичок в DRF, я работаю над API регистрации

Моя Модель

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, user_type, password=None, **extra_fields):
        email = self.normalize_email(email)
        user = self.model(email=email, user_type=user_type, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
class CustomUser(AbstractBaseUser):
    USER_TYPE_CHOICES = (
        ('seller', 'Seller'),
        ('user', 'User'),
    )
    username = models.CharField(unique=True, max_length=20, null=True, blank=True,)
    email = models.EmailField(unique=True, blank=True,)
    first_name =  models.CharField(max_length=256 , blank=True,)
    last_name =  models.CharField(max_length=256, blank=True,)
    user_type = models.CharField(max_length=10, choices=USER_TYPE_CHOICES , blank=True,)
    email_otp =  models.CharField(max_length=10, blank=True,)
    phone_otp =  models.CharField(max_length=10, blank=True,)
    email_verified  = models.BooleanField(default=False, blank=True,)
    create_at = models.DateTimeField(auto_now_add=True, blank=True,)
    update_at = models.DateTimeField(auto_now=True, blank=True,)
    is_active = models.BooleanField(default=True, blank=True,)
    is_staff = models.BooleanField(default=False, blank=True,)
    objects = CustomUserManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['user_type']

class SellerProfile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    address_1 = models.CharField(max_length=255, blank=True,)
    address_2 = models.CharField(max_length=255, default="Null", blank=True,)
    address_3 = models.CharField(max_length=255, default="Null", blank=True,)
    state = models.CharField(max_length=100, blank=True,)
    phone_number = models.CharField(max_length=15, blank=True,)
    zip_code = models.CharField(max_length=10, blank=True,)

class UserProfile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE , blank=True,)
    profile_pic = models.ImageField(upload_to='profile_pics', blank=True, null=True)
    bio = models.TextField(blank=True,)
    dob = models.DateField(blank=True,)
    phone_number = models.CharField(max_length=15, blank=True,)

Мой сериализатор

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('profile_pic', 'bio', 'dob', 'phone_number')

class SellerProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = SellerProfile
        fields = ('address_1', 'address_2', 'address_3', 'state', 'phone_number', 'zip_code')
        
class RegistrationSerializer(serializers.ModelSerializer):
    profile = serializers.DictField(child=serializers.CharField(), write_only=True)

    class Meta:
        model = CustomUser
        fields = ('email', 'password', 'profile', 'email_otp', 'phone_otp', 'username', 'first_name', 'last_name', 'user_type')
        extra_kwargs = {
            'email': {'required':False, 'allow_blank':True, 'allow_null':True},
            'password': {'required':False, 'allow_blank':True, 'allow_null':True},
            'email_otp': {'required':False, 'allow_blank':True, 'allow_null':True},
            'phone_otp': {'required':False, 'allow_blank':True, 'allow_null':True},
            'username': {'required':False, 'allow_blank':True, 'allow_null':True, 'allow_blank': True},
            'first_name': {'required':False, 'allow_blank':True, 'allow_null':True},
            'last_name': {'required':False, 'allow_blank':True, 'allow_null':True},
            'user_type': {'required':False, 'allow_blank':True, 'allow_null':True},
        }
    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        email = validated_data.pop('email', None)
        username = validated_data.pop('username', None)
        user_type = validated_data.pop('user_type', 'seller' if 'profile_pic' not in profile_data else 'user')
        user = CustomUser.objects.create_user(**validated_data, username=username, email=email, user_type=user_type)
        email_otp = ''.join([str(randint(0, 9)) for _ in range(6)])
        phone_otp = ''.join([str(randint(0, 9)) for _ in range(6)])
        user.email_otp = email_otp
        user.phone_otp = phone_otp
        user.save()
        if user_type == 'user':
            UserProfile.objects.create(user=user, **profile_data)
        else:
            SellerProfile.objects.create(user=user, **profile_data)
        send_registration_email.delay(
            'Welcome to Your Website',
            'email.html',
            {'code': email_otp},
            settings.EMAIL_HOST_USER,
            [user.email],
        )
        return user

Мой взгляд

class RegistrationView(APIView):
    def post(self, request, format=None):
        serializer = RegistrationSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            response_data = {
                "message": "Please verify your email",
                "user_id": user.id
            }
            return Response(response_data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

я отметил все поля, которые могут принимать пустые и нулевые значения, но все равно получаю эту ошибку

{
    "profile": {
        "address_1": [
            "This field may not be blank."
        ],
        "address_2": [
            "This field may not be blank."
        ],
        "address_3": [
            "This field may not be blank."
        ]
    }
}

также, когда я ввожу тот же email снова, я получаю сообщение об ошибке типа пользовательский email уже существует, но я создал пользовательское сообщение "email уже занят"

пожалуйста, посмотрите на этот код и сообщите мне изменения, которые я должен сделать, также сообщите мне правильный способ сделать это

По умолчанию в Django Rest Framework поля CharFields определяются с allow_blank=False

allow_blank - Если установлено значение True, то пустая строка должна считается допустимым значением. Если установлено значение False, то пустая строка будет будет считаться недопустимой и вызовет ошибку проверки. По умолчанию False.

Смотрите https://www.django-rest-framework.org/api-guide/fields/

Вернуться на верх