2017-10-06 3 views
0

J'ai des modèles comme ci-dessous.Django REST serialize sortie - groupe par des clés étrangères

restaurant Modèle

class Restaurant(models.Model): 

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

Menu Modèle

class Menu(models.Model): 

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

Article Modèle

class Item(models.Model): 

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

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

Je veux obtenir les menus pour l'ID magasin.

Comment regrouper mes résultats par menu pour l'identifiant du restaurant?

appel GET/menus/restaurant_id

Sample.

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

Merci ..

Répondre

1

La seule chose que je peux trouver est Postgres fonction d'agrégation spécifique ArrayAgg

Vous pouvez l'utiliser comme ceci:

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'] 
#  }, 
# ] 

Ces qs effectue suivant sql premières requête:

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" 

Probablement, il peut vous aider.