一直以来写 Restful
接口都是很暴力的,很直接,模型设计好之后,相关的 serializer
都是单向引用,组合成复杂的数据结构。之前也有用过 serializers
的复合字段,应用的地方不是很多,现在思考回想,复合字段应用的场景对于一般业务都是可以忽略不计,针对特殊(XJBD)的业务场景,还是挺棒的。
注:这里只使用了 serializers.ListField
作为例子,其他字段应用方式大体相同
@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
属性
class ConfigSerializer(serializers.ModelSerializer): photos = serializers.ListField(child=serializers.CharField()) class Meta: model = Config fields = ('key', 'value', 'verbose_key', 'photos')
[ { "key": "like", "value": "1", "verbose_key": "xxx", "photos": [ "a", "b", "c" ] } ]
可以说应用方式及其简单,这种方式没有引用其他的 serializer
, 也做到了复杂数据的输出(这里复杂相对还是比较简单)
和引用其他 serializer
相比,我也看了我们之前开发的业务场景,针对一些特殊诡异的需求,比如多表联合查询过滤,这个时候不必针对每个模型写 serializer
, 直接在特定的模型中写 @property
的业务,业务返回特定需求的 queryset
复合字段
针对特殊的业务场景
serializer 引用
针对一般的业务场景