转载

Django-rest-framework | Composite fields 简单应用

1 引言

一直以来写 Restful 接口都是很暴力的,很直接,模型设计好之后,相关的 serializer 都是单向引用,组合成复杂的数据结构。之前也有用过 serializers 的复合字段,应用的地方不是很多,现在思考回想,复合字段应用的场景对于一般业务都是可以忽略不计,针对特殊(XJBD)的业务场景,还是挺棒的。

2 例子

注:这里只使用了 serializers.ListField 作为例子,其他字段应用方式大体相同

2.1 model

@python_2_unicode_compatible class Config(models.Model):     """config options"""     verbose_key = models.CharField('xx', max_length=20, null=True, blank=True,                                    help_text='verbose key name', default='')     key = models.CharField('xx', help_text='ensure unique', max_length=20,                            primary_key=True)     value = models.CharField('xx', max_length=50)      class Meta:         verbose_name_plural = 'xxx'      def __str__(self):         return self.key      @property     def photos(self):         return ['a', 'b', 'c']      @photos.setter     def photos(self, value):         pass

模型中注意 photos 属性

2.2 serializer

 class ConfigSerializer(serializers.ModelSerializer):     photos = serializers.ListField(child=serializers.CharField())      class Meta:         model = Config         fields = ('key', 'value', 'verbose_key', 'photos')

2.3 execute result

[   {     "key": "like",     "value": "1",     "verbose_key": "xxx",     "photos": [       "a",       "b",       "c"     ]   } ]

3 简单思考

可以说应用方式及其简单,这种方式没有引用其他的 serializer , 也做到了复杂数据的输出(这里复杂相对还是比较简单)

和引用其他 serializer 相比,我也看了我们之前开发的业务场景,针对一些特殊诡异的需求,比如多表联合查询过滤,这个时候不必针对每个模型写 serializer , 直接在特定的模型中写 @property 的业务,业务返回特定需求的 queryset

比较:简单来说

  • 复合字段 针对特殊的业务场景

  • serializer 引用 针对一般的业务场景

原文  http://segmentfault.com/a/1190000004292907
正文到此结束
Loading...