rest-framework 中增加自定义显示字段

 

在我们用serializers.ModelSerializer序列化时会出现以下两种情况

1.关联的外键,会把它所关联对象的所有字典都显示出来,增加了不必要的查询

2.genericRelation关联的表的字段不显示

 degreecourse_price_policy = GenericRelation("PricePolicy")

如何解决上边这两个问题呢?

这时候我们需要自定义显示字段了:

rest-framework给我提供了一个字段类型SerializerMethodField()

1.针对普通字段 不需要这个字段类型

2.针对多对多字段

class DegreedetailSerializer(ModelSerializer):
    show_teachers=serializers.SerializerMethodField()

    class Meta:
        model=DegreeCourse
        fields=['id','name','show_teachers','price_policy']
    def get_show_teachers(self,obj):#注意字段名前面要加get
        teacher_list=obj.teachers.all()
        return [{"id": row.id,"name":row.name} for row in teacher_list]
   

3.针对GenericRelation()字段

class DegreedetailSerializer(ModelSerializer):
    price_policy=serializers.SerializerMethodField()
    class Meta:
        model=DegreeCourse
        fields=['id','name','show_teachers','price_policy']
  
    def get_price_policy(self,obj):#字段前面也有 一个get
        price_policy_list=obj.degreecourse_price_policy.all()
        return [{'id':row.id,'price':row.price,'period':row.get_valid_period_display()} for row in price_policy_list] #period是choice类型字段需要 get_字段名_display()

4.针对一对多外键字段和一对一字段

source参数:不能用在GenericRelation字段和manytomany字段看源码

  show_sub_category = serializers.CharField(source='sub_category.name')#用的是CharField()字段

5.针对 字段中含有choice参数的字段:例如

course_type_choices = ((1, '付费'), (2, 'VIP专享'), (3, '学位课程'))
    course_type = models.SmallIntegerField(choices=course_type_choices)

 

可以这么做:

 course_type = serializers.CharField(source='get_course_type_display')#get_字段名_display不用加括号

 

 
 
posted @ 2019-03-27 23:06  种树飞  阅读(828)  评论(0)    收藏  举报