Как использовать один и тот же класс сериализатора для метода get и post в Django?

Я пытался, но безуспешно, использовать только один класс сериализатора для вызовов post и get api. У меня есть модель Person, которая имеет некоторые поля. Мне нужно создать объект person с помощью post API с определенными полями, но при этом нужно показать некоторые другие поля при выполнении get запроса. Например:

Моя модель:

class Person(models.Model):
    name = models.CharField(max_length=255,blank=True)
    email = models.EmailField(unique=True)
    phone = models.CharField(max_length=16)
    address = models.CharField(max_length=255,blank=True)
    roll = models.IntegerField()
    subject = models.CharField(max_length=255,blank=True)
    college_name = models.CharField(max_length=255,blank=True)

Теперь мой сериализатор будет выглядеть следующим образом.

class PersonSerializer(serializers.ModelSerializer):

class Meta:
    model = Student
    fields = ['id','email','name','phone','roll','subject','college_name', 'address']

Например, у меня есть представление, которое обрабатывает post и get запросы (возможно, используя APIView), тогда мне нужно сделать следующее: для создания объекта person я использую только имя, телефон и email. Поэтому для вызова API post мне нужно только три поля, в то время как при вызове API get мне нужно отобразить только поля name, roll, subject, и college_name, а не другие.

В этой ситуации, как я могу справиться с использованием одного класса сериализатора?

Вы можете установить поля только для чтения (для GET запросов) с помощью списка read_only_fields и только для записи (для POST, PUT, PATCH) с помощью словаря extra_kwargs, оба внутри класса Meta сериализатора:

class PersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ['id', 'email', 'name', 'phone', 'roll', 'subject', 'college_name']
        read_only_fields = ['roll', 'subject', 'college_name']
        extra_kwargs = {
            'email': {'write_only': True},
            'phone': {'write_only': True},
        }

Сначала в модели необходимо добавить атрибут null=True в не обязательные поля.

class Person(models.Model):
    name = models.CharField(max_length=255,blank=True)
    email = models.EmailField(unique=True)
    phone = models.CharField(max_length=16)
    # here I added `null=True`
    address = models.CharField(max_length=255,blank=True, null = True)
    roll = models.IntegerField(null = True)
    subject = models.CharField(max_length=255,blank=True, null = True)
    college_name = models.CharField(max_length=255,blank=True, null = True)

В сериализаторе нужно добавить свойство extra_kwargs, чтобы установить поля только для чтения.

class PersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ['id', 'email', 'name', 'phone', 'roll', 'subject', 'college_name']
        extra_kwargs = {
            'roll': {'read_only': True},
            'subject': {'read_only': True},
            'college_name': {'read_only': True},
        }
Вернуться на верх