常梦网 常梦网

Django-rest-framework | Composite fields 简单应用 - 黑月亮

时间: 2024-04-30  热度:

1 引言

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

2 例子

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

2.1 model

@python_2_unicode_compatibleclass 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

比较:简单来说

相关阅读