繁体   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