2017-09-24 204 views
1

我有像下面這些模型。Django REST組外鍵模型

菜單模型

class Menu(models.Model): 

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

產品型號

class Item(models.Model): 

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

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

我想要得到的店鋪ID菜單。

Item.objects.filter(shop_id = 1)

我怎麼能組我的結果通過菜單名稱爲店鋪ID 1?

樣品。

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

謝謝..

+0

你要求的查詢嗎? – Akash

+0

是的。和序列化器來獲取json。 ?或者這個結果有任何模型結構變化? –

回答

1

你可以得到嵌套的序列化所需輸出如下:

車型

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) 

串行

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') 

意見

class MenuList(generics.ListAPIView): 
    serializer_class = MenuSerializer 

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

我相信你不想每次得到shop_id = 1 這樣做:

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

我們也可以分成另一個模型ShopMenu - 有商店ID和菜單ID,並使項目外鍵。你對這種設計有什麼看法?那比現在的設計更合適? –

+0

這是高度依賴於您的業務需求,但一個建議,儘可能簡單 – Serjik

+0

必須刪除獨特 - 菜單可以有很多項目。如果我刪除查詢返回重複值兩次爲特定商店的兩個項目。 Menu.objects.filter(item__shop__id = 1) - 返回兩個條目。所以我沒有團隊。 ? –