2017-10-06 46 views
0

我有像下面的模型。Django REST序列化輸出 - 按外鍵組

餐廳型號

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 /菜單/ restaurant_id

樣品。

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

謝謝..

回答

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" 

可能它可以幫助你。