2009-09-16 30 views
3

以下型號值:檢索來自2頁不同的表Django的查詢集

class Topping(models.Model): 
    name = models.CharField(max_length=100) 

class Pizza(models.Model): 
    name = models.CharField(max_length=100) 
    toppings = models.ManyToManyField(Toppping) 

我的數據如下所示:

比薩和一流的表連接:

ID NAME  TOPPINGS 
------------------------------------ 
1 deluxe  topping_1, topping_2 
2 deluxe  topping_3, topping_4 
3 hawaiian topping_1 

我想拿到比薩ID與命名deluxe所有比薩及其相應的配料一起。我預期的結果是:

1 topping_1 
1 topping_2 
2 topping_3 
2 topping_4 

結表:

pizza_toppings 
-------------- 
id  
pizza_id  
topping_id 

下面是SQL相當於什麼,我要實現的:

SELECT p.id, t.name 
FROM pizza_toppings AS pt 
INNER JOIN pizza AS p ON p.id = pt.pizza_id 
INNER JOIN topping AS t ON t.id = pt.topping_id 
WHERE p.name = 'deluxe'  

什麼相應的Django的queryset任何想法好像?如果上述內容不夠具有挑戰性,我還想按名稱對產生的配料進行排序。

回答

2

我不認爲這是一個乾淨的解決方案,這一點,因爲你想從兩個不同的模型數據。根據您的數據結構,你可能想使用select_related避免碰到的所有配料的數據庫。去你想要的結果,我會做:

result = [] 
pizzas = Pizza.objects.select_related().filter(name='deluxe') 
for pizza in pizzas: 
    for toppings in pizza.toppings.all(): 
     result.append((pizza.pk, topping.name)) 

這將產生:

[ 
    (1, topping_1), 
    (1, topping_2), 
    (2, topping_3), 
    (2, topping_4), 
] 

現在有不同的方式來設置數據,使用列表,元組和字典,但我想你你如何做到這一點的想法。

+0

偉大的,隨着問題http://stackoverflow.com/questions/72899/in-python-how-do-i-sort-字典的字典列表幫助解決了我的問題。 – 2009-09-17 14:17:24

0

沒有直接的方式來獲得一個比薩餅當你從上面的模型摘心。你可以做

pizzas = topping.pizza_set.all() 

與澆頭或可能是所有比薩(如果摘心存在於只有一個比薩餅名爲「豪華」)

pizza = topping.pizza_set.get(name="deluxe") 

一旦你有一個摘心。或者,你可以存儲比薩和摘心在元組或字典的列表(如果沒有重複的頂飾):

toppings = {} 
pizzas = Pizza.objects.filter(name="deluxe") 
for pizza in pizzas: 
    for topping in pizza.toppings.all(): 
     toppings[topping.name] = pizza.name 
sorted_toppings = toppings.keys() 
sorted_toppings.sort() 

然後你可以用詞典中的餡料取比薩餅。

+0

我有解決方案也一樣,我在想,如果有,因爲我也想通過名字我的澆頭排序更優雅的一個。 – 2009-09-16 21:31:57

+0

有可能更優雅的方式來實現這一目標。排序不是一個問題,雖然: toppings =列表(澆頭) toppings.sort() – 2009-09-16 21:35:37

+0

這種解決方案的比薩餅排序的頂部,我的目標是得到一個全球排序的豪華披薩配料列表。 – 2009-09-16 21:40:46