[英]Django Rest Serializer: Use nested serializer on GET but not POST
[英]How to use same serializer class for get and post method in Django?
我一直在尝试,但惨遭失败,只对 post 和 get api 调用使用一个序列化程序类。 我有一个 Person 模型,它有一些字段。 我需要的是我想使用带有某些字段的 post API 创建一个人对象,但是在执行获取请求时需要显示一些其他字段。 例如:
我的模型:
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),那么我需要做的是创建一个我只使用姓名、电话和电子邮件的人员对象。 因此,对于 post API 调用,我只需要三个字段,而在调用 get API 时,我只需要显示字段名称、滚动、主题和学院名称,而不是其他字段。
在这种情况下,我该如何处理使用相同的序列化程序类?
您可以使用read_only_fields
列表将字段设置为只读(对于 GET 请求),使用extra_kwargs
字典将字段设置为只读(对于 POST、PUT、PATCH),两者都在 Serializer 的 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},
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.