2017-09-24 127 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) - 返回两个条目。所以我没有团队。 ? –