PostgreSQL 提供了聚合类 ArrayAgg, 能够方便的完成列表的聚合.
Returns a list of values, including nulls, concatenated into an array, or
defaultif there are no values.
例如
class Item(models.Model):
name = models.CharField(max_length=20)
class A(models.Model):
name = models.CharField(max_length=20)
items = models.ManyToManyField(to=Item)
打算将A模型序列化成以下形式
[
{
"id": 1,
"name": "名称1",
"item_list": [ 410,415,416]
},
{
"id": 2,
"name": "名称2",
"item_list": [ 411,415,416]
},
]
也就是说, 将 ManyToManyField 这种外键直接序列化成列表形式. 这时候可以采用下述方式
A.objects.annotate(
item_list=ArrayAgg('items',distinct=True)).values(
'id', 'name', 'item_list')
非常简洁优雅,且这是数据库底层支持的函数, 所有运行效率也非常高.
可以看出, Django项目采用 PostgreSQL 作为数据库还是非常有价值的.








网友评论