Я хочу создать пользователя, который хранит внешний ключ своей страны. Очевидно, я хочу сделать это обязательным для заполнения полем.
Но когда я отправляю запрос POST без поля 'страна', DRF Serializer не выдает ошибку.
Нигде в коде я не разрешил поле должно быть пустым, оно такое же, как и остальные.
Я сделал еще один шаг, и в методе create()
моего ModelViewSet
я решил напечатать serializer.validated_data
class UserViewSet(ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
permission_classes = []
def create(self, request, format=None):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
print(serializer.data)
Я отправляю следующий запрос POST:
И мое значение serializer.validated_data
было:
OrderedDict([('password', 'test1231112'), ('first_name', 'Jarosław'), ('last_name', 'Psikuta'), ('phone', '2999111331'), ('email', 'rweww@gmail.css'), ('description', 'fajny uzytkownik'), ('address', 'Mieszka 3/4'), ('date_of_birth', datetime.date(1997, 10, 13))])
Я понял, что сериализатор просто не вижу мое поле country
.
Я уже пишу код, чтобы проверить, существует ли мое поле country
:
country_code = request.data.get('country', None)
if not country_code:
return Response({'country': 'This field is required'}, status=status.HTTP_400_BAD_REQUEST)
, но я знаю, что это неправильный подход. Это дополнительный код, и на самом деле сериализатор должен сделать эту работу для меня.
Здесь у вас есть остальная часть моего кода:
serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
read_only_fields = ('id', 'last_login', 'is_superuser', 'is_staff', 'is_active','date_joined', 'groups', 'user_permissions')
extra_kwargs = {
'password': {'write_only': True}
}
depth = 1
def create(self, validated_data):
password = validated_data.pop('password')
user = User(**validated_data)
user.set_password(password)
user.save()
return user
models.py
class User(AbstractUser):
EMPLOYEE_TYPES = [
('R', 'Regular'),
('S', 'Specialist')
]
username_validator = None
username = None
first_name = models.CharField(_('first name'), max_length=30)
last_name = models.CharField(_('last name'), max_length=150)
phone = models.CharField(max_length=15, unique=True)
employee_type = models.CharField(max_length=1, choices=EMPLOYEE_TYPES, default='R')
email = models.EmailField(_('email address'), unique=True, max_length=255)
description = models.CharField(blank=True, max_length=500, default='')
address = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True)
country = models.ForeignKey(Country, on_delete=models.CASCADE, related_name='users')
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name', 'date_of_birth', 'address', 'phone', 'country']