Переопределение поля в Сериализаторе - PullRequest
0 голосов
/ 09 января 2019

Я следую учебнику по DRF, и там я столкнулся с «сериализатором». Почти все было легко понять, кроме этого - когда вы переопределяете поле, которое уже находится в вашем подключении (по полю модели в метаклассе).

Ниже приводится сериализатор модели 'user'

class RegistrationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(
        max_length = 128,
        min_length=8,
        write_only=True 
    )

    token = serializers.CharField(max_length=255, read_only=True)

    class Meta:
        model = User

    def create(self, validated_data):
        return User.objects.create_user(**validated_data)

И другой код здесь, соответствующая модель сериализатора выше, 'Пользователь'

class User(AbstractBaseUser, PermissionsMixin):

    username = models.CharField(db_index=True, max_length=255, unique=True)
    email = models.EmailField(db_index=True, unique=True)

    #Here, the password field here!
    password = models.CharField(_('password'), max_length=128)

    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

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

Не могли бы вы объяснить причину, по которой мы это делаем?

1 Ответ

0 голосов
/ 09 января 2019

Обратите внимание, что User.password - это поле модели django, а RegistrationSerializer.password - поле сериализатора.

Из документов цель сериализатора в этом случае - преобразовать модель "в собственные типы данных Python, которые затем можно легко преобразовать в JSON, XML или другие типы контента". В качестве небольшого упрощения представьте, что сериализатор определяет, как все выглядит в вашем API, а модель определяет интерфейс к вашей базе данных. Поле сериализатора определяет способ преобразования одного поля модели. Если ваш сериализатор наследует от DRF ModelSerializer, то DRF пытается определить, как сериализовать все поля в этой модели , для которых еще нет соответствующего поля сериализатора, определенного в вашем классе сериализатора, Поэтому определение поля в сериализаторе не переопределяет его, а говорит DRF не пытаться вывести спецификацию.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...