Django Rest Framework : как определить сериализатор для использования различных полей для создания, обновления и получения

У меня есть сомнения по поводу сериализаторов и пока что я не смог их решить. Я объясняю сомнения на следующем примере:

У меня есть модель User, и эта модель имеет следующие атрибуты: username, password, first_name, last_name, age, gender. У меня также есть сериализатор, который называется UserSerializer. UserSerializer должен делать следующее:

  • При вставке информации в базу данных UserSerializer должен учитывать только поля: username, password, first_name, last_name.

  • При извлечении информации из базы данных UserSerializer должен учитывать только поля: возраст, пол.

  • При обновлении информации из базы данных, UserSerializer должен учитывать только поля: пароль.

Мое решение:

class UserSerializer:

    class UserCreateSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ['username', 'password', 'first_name', 'last_name']

    class UserGetSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ['age', 'gender']

    class UserUpdateSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ['password']

Вопрос:

Вопрос: есть ли способ синтезировать три сериализатора в один, или каково лучшее решение для этой проблемы?

Большое спасибо.

Используйте параметры write_only и read_only в полях сериализатора, чтобы указать поля для создания и извлечения

class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(write_only=True, required=False)
    password = serializers.CharField(write_only=True)
    first_name = serializers.CharField(write_only=True, required=False)
    last_name = serializers.CharField(write_only=True, required=False)
    age = serializers.IntegerField(read_only=True)
    gender = serializers.CharField(read_only=True)


    class Meta:
        model = User
        fields = ['username', 'password', 'first_name', 'last_name', 'age', 'gender']

Если какое-либо поле является необязательным, то можно добавить required=False

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