2017-10-06 1 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" 

아마 당신을 도울 수 있습니다.

관련 문제