"Это поле не может быть пустым". 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/