Django REST序列化输出 - 按外键分组

时间:2017-10-06 14:18:24

标签: python django django-models django-rest-framework

我有类似下面的模型。

餐厅模特

class Restaurant(models.Model):

    name = models.CharField(max_length=40, verbose_name='Name')

菜单型号

class Menu(models.Model):

    name = models.CharField(max_length=40, unique=True, verbose_name='menu name')

项目模型

class Item(models.Model):

    restaurant = models.ForeignKey(Restaurant)
    menu = models.ForeignKey(Menu)

    name = models.CharField(max_length=500)
    price = models.IntegerField(default=0)

我想获得商店ID的菜单。

如何根据餐馆ID的菜单对结果进行分组?

致电GET / menus / restaurant_id

样品。

{
 name: menu name 1
 items: [ {item1}, {item2}]
},
{
 name: menu name 2
 items: [ {item1}, {item2}]
}

谢谢..

1 个答案:

答案 0 :(得分:1)

我唯一能找到它的postgres特定聚合函数ArrayAgg

你可以像这样使用它:

from django.contrib.postgres.aggregates import ArrayAgg

Item.objects.filter(restaurant_id=1).values('menu__name').annotate(items=ArrayAgg('name'))

# example output: 
# [
#     {
#         'menu__name': 'menu1',
#         'items': ['item1', 'item2']
#     },
#     {
#         'menu__name': 'menu2',
#         'items': ['item3', 'item4']
#     },
# ]

这样的qs执行下一个原始sql查询:

SELECT
  "appname_menu"."name",
  ARRAY_AGG("appname_item"."name") AS "items"
FROM "appname_item"
  INNER JOIN "appname_menu" ON ("appname_item"."menu_id" = "appname_menu"."id")
WHERE "appname_item"."restaurant_id" = 1
GROUP BY "appname_menu"."name"

可能它可以帮助你。