2017-09-24 16 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)

どのようにすることができますIグループ店舗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) 

私はあなたが毎回= 1 shop_idを取得したくないと確信していますので、この操作を行います。

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

もう1つのモデルShopMenuに分割することもできます - whickはショップIDとメニューIDを持ち、項目に外部キーを作成します。そのデザインについてどう思いますか?それは現在のデザインよりも適していますか? –

+0

それはあなたのビジネスニーズに大きく依存しますが、アドバイスの一部はできるだけシンプルに保ちます – Serjik

+0

は、ユニークなメニューを削除する必要があります。クエリを削除すると、特定のショップの2つのアイテムに対して2つの値が重複して返されます。 Menu.objects.filter(item__shop__id = 1) - 2つのエントリを返します。だから私はグループに入れない。 ? –

関連する問題