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不用加括号
公众号 种树飞编程 欢迎关注