我有类似下面的模型。
餐厅模特
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}]
}
谢谢..
答案 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"
可能它可以帮助你。