Как заставить CreateAPIView распознать секцию "validate" моего сериализатора?
Я использую Django 3.2 и Django rest framework 3.12.2 и у меня установлен django.contrib.auth. Я хотел бы создать конечную точку для создания пользователей, поэтому я установил это в моих представлениях ...
class CreateUserView(CreateAPIView):
model = User
permission_classes = [
IsAuthenticated
]
serializer_class = UserSerializer
И я создал этот сериализатор ...
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'password', 'email', 'id', 'first_name', 'last_name')
def validate(self, data):
errors = {}
# required fields
required_fields = ['username', 'password', 'email']
for field in required_fields:
if not data[field]:
errors[field] = 'This field is required.'
if errors:
raise serializers.ValidationError(errors)
return data
def create(self, validated_data):
user = User.objects.create_user(
username=validated_data['username'],
password=validated_data['password'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
email=validated_data['email']
)
return user
К сожалению, когда я отправляю запрос без определенных полей (например, "email"),
read -d '' req << EOF
{
"first_name": "Test 9999",
"last_name": "Dave",
"username": "test3@abc.com",
"password": "password1"
}
EOF
curl --header "Content-type: application/json" --header "Authorization: Token 6cbf7a80c6dd40e84861c8de143c945aef725676" --data "$req" --request POST "http://localhost:8000/users/"
Мой валидатор не работает, и вместо этого я получаю ошибки в части "create" моего сериализатора ...
File "/Users/davea/Documents/workspace/chicommons/maps/web/directory/serializers.py", line 453, in validate
if not data[field]:
KeyError: 'email'
Как мне структурировать мое представление так, чтобы валидатор в моем сериализаторе был распознан?
Вы можете проверить с помощью:
def validate(self, data):
errors = {}
# required fields
required_fields = ['username', 'password', 'email']
for field in required_fields:
if field not in data:
errors[field] = 'This field is required.'
if errors:
raise serializers.ValidationError(errors)
Но, вероятно, более разумно позволить сериализатору подтвердить их, сделав эти поля обязательными.