![](/img/trans.png)
[英]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.