Как заставить 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)

Но, вероятно, более разумно позволить сериализатору подтвердить их, сделав эти поля обязательными.

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