Использование одного и того же класса сериализатора для запросов post и get во фреймворке Django rest
У меня есть модель Student, которая имеет некоторые поля. Мне нужно создать объект студента с помощью post API с определенными полями, но при этом нужно показать некоторые другие поля при выполнении get запроса. Например:
Моя модель:
class Students(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 StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ['id','email','name','phone','roll','subject','college_name', 'address']
Предположим, у меня есть представление, которое обрабатывает post и get api (возможно, используя APIView), тогда мне нужно, чтобы для создания объекта студента мне нужны только имя, телефон и email. Таким образом, для вызова post api мне нужно только три поля, в то время как при вызове get api мне нужно отобразить только поля name, roll, subject, и college_name без других.
В этой ситуации, как я могу справиться с использованием одного класса сериализатора?
Вам не нужен другой сериализатор для POST, он вернет эти поля, но вам не нужно отправлять все эти поля, однако когда вы отправите POST запрос, вы получите ошибку, в которой будет написано что-то вроде
'email' это поле обязательно для заполнения потому что в вашей модели вы не указали, что оно может быть null
.
Обновите вашу модель следующим образом
class Students(models.Model):
name = models.CharField(max_length=255, null=True, blank=True)
email = models.EmailField(unique=True, null=True, blank=True)
phone = models.CharField(max_length=16, null=True, blank=True)
address = models.CharField(max_length=255, null=True, blank=True)
roll = models.IntegerField()
subject = models.CharField(max_length=255, null=True, blank=True)
college_name = models.CharField(max_length=255, null=True, blank=True)
затем переместите его, он должен работать, И если вы хотите какой-то пользовательский метод создания, вы можете переопределить serialiers
def create(self, validated_data):
метод кстати, вы можете просто набрать
fields = '__all__'
в вашем сериализаторе, поскольку вы используете все поля