2017-10-11 31 views
0

我的標題可能看起來含糊不清,但我很抱歉保存我沒有其他想法來說明這一點。假設我的模型結構如下所示:Django ORM:在多個外鍵上對列表查詢進行分類

class Restaurant(models.Model): 
    name = models.CharField(...necessary stuff...) 

class Cuisine(models.Model): 
    name = models.CharField(...necessary stuff...) 
    # thai chinese indian etc. 

class Food(models.Model): 
    restaurant = models.ForeignKey(Restaurant, related_name='restaurant') 
    cuisine = models.ForeignKey(Cuisine, related_name='cuisine') 
    name = models.CharField(...) 

我想要的是特定餐廳的食物對象列表。但食物對象需要在他們各自的菜餚下,以便我可以通過上下文輕鬆訪問食物。有沒有可能以任何方式實現這一點?

我當前的查詢:

q = Cuisine.objects.prefetch_related('cuisine') 
q = q.filter(cuisine__restaurant_id=restaurant.id) # say restaurant.id=1 
# here restaurant is the object which I have retrieved 

那麼,它的作用是它過濾提供給餐廳的美食,但也列出了這些美食中的所有食物。我只想要餐廳提供的食物。我認爲我錯過了建立模型的方式,但我不確定。如果有人能指出我正確的方向,那將會非常有幫助。謝謝。

回答

1
Food.objects.filter(restuarant_id=1, cuisine_id__in=selected_cuisine_ids) 

這裏,selected_cuisine_ids是哪個的美食需要

+0

謝謝,添加此查詢prefetch_related(Prefetch(...))做了這個把戲:D – flaire

0

在我看來,你應該使用ManyToManyFieldthrough的論點。所以,你的模型應該是這樣的:

class Restaurant(models.Model): 
    name = models.CharField(...necessary stuff...) 
    cuisines = models.ManyToManyField(Restaurant, through='Food', related_name='restaurants') 

class Cuisine(models.Model): 
    name = models.CharField(...necessary stuff...) 
    # thai chinese indian etc. 

class Food(models.Model): 
    restaurant = models.ForeignKey(Restaurant, related_name='restaurant') 
    cuisine = models.ForeignKey(Cuisine, related_name='cuisine') 
    name = models.CharField(...) 

這樣,您的查詢會是這樣:

Cuisine.objects.filter(restaurants__id=1) 
+0

ID列表我已經試過這個,問題是我不只是想要美食,我想要包括每個菜餚下的食物(這是由餐廳服務)以及 – flaire