Как использовать один и тот же класс сериализатора для метода 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},
}