簡體   English   中英

如何在 Django 中為 get 和 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM