2017-09-24 3 views
1

Ich habe Modelle wie unten.Django REST Gruppe Fremdschlüssel Modelle

Menü Modell

class Menu(models.Model): 

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

Position Modell

class Item(models.Model): 

    shop = models.ForeignKey(Shop) 
    menu = models.ForeignKey(Menu) 

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

Ich mag die Menüs für die Shop-ID bekommen.

Item.objects.filter (Arbeitsplatz_id = 1)

Wie kann ich meine Gruppe der Ergebnisse nach Menü-Namen für die Shop-ID 1.?

Probe.

{ 
menu: menuname1 
items: [ {item1}, {item2}] 
}, 
{ 
menu: menuname2 
items: [ {item1}, {item2}] 
} 

Dank ..

+0

Sie fragen Abfrage nicht wahr? – Akash

+0

ja. und Serializer, um den JSON zu bekommen. ? Oder irgendwelche Modellstrukturänderungen für dieses Resultat? –

Antwort

1

Sie können Ihre gewünschte Ausgabe mit verschachtelten Serializer erhalten wie folgt:

Modelle

class Item(models.Model): 
    class Meta: 
     unique_together = ('shop', 'menu',) 

    shop = models.ForeignKey(Shop) 
    menu = models.ForeignKey(Menu, related_name='items') 
    name = models.CharField(max_length=500) 
    price = models.IntegerField(default=0) 

Serializer

class ItemSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Item 
     fields = '__all__' 

class MenuSerialzer(serializers.ModelSerializer): 
    items = ItemSerializer(many=True, read_only=True) 
    class Meta: 
     model = Menu 
     fields = ('name','items') 

Ansichten

class MenuList(generics.ListAPIView): 
    serializer_class = MenuSerializer 

    def get_queryset(self): 
     return Menu.objects.filter(item__shop__id = 1) 

Ich bin sicher, dass Sie nicht jedes Mal diese Arbeitsplatz_id = 1 so tun bekommen:

class MenuList(generics.ListAPIView): 
    def get_queryset(self): 
     shop_id = int(self.kwargs['shop_id']) 
     return Menu.objects.filter(item__shop__id = 1) 

url.py

urlpatterns = [ 
    url('^menus/(?P<shop_id>[0-9]+)/$', MenuList.as_view()), 
] 
+0

Wir können auch auf ein weiteres Modell ShopMenu - whick hat Shop-ID und Menü-ID, und machen Fremdschlüssel zu Artikel. Was denkst du über dieses Design? Das ist besser geeignet als das aktuelle Design? –

+0

Es ist sehr abhängig von Ihren geschäftlichen Anforderungen, aber ein Ratschlag, halten Sie es so einfach wie möglich – Serjik

+0

müssen das einzigartige entfernen - Menü kann viele Elemente haben. Wenn ich die Abfrage lösche, werden doppelte Werte zweimal für zwei Artikel für den bestimmten Shop zurückgegeben. Menu.objects.filter (item__shop__id = 1) - gib zwei Einträge zurück. also konnte ich nicht gruppieren. ? –

Verwandte Themen