2011-06-14 18 views
12

我該如何構建一個從django獲取多行的QuerySet?我認爲filter()會起作用,但它似乎更糟糕。在django中獲取一個查詢的多行?

例如,我在模型Car中有兩行,有兩個文本屬性(許可證和vin)。現在說我想打印這些車的牌照和酒。我怎樣才能做到這一點與一個數據庫調用?

這裏有一個答案,這將使兩臺數據庫調用:

#using get(), two total queries 
a = Car.objects.get(id=1) #query here 
b = Car.objects.get(id=2) #query here 
print(a.license + a.vin) #no query 
print(b.license + b.vin) #no query 

這顯然是因爲我做了兩個GET()查詢沒有工作。所以接下來我會嘗試過濾器():

#using filter(), four total queries 
c = Car.objects.filter(id__in=(1,2)) #no query 
print(c[0].license + c[0].vin) #two queries 
print(c[1].license + c[1].vin) #two queries 

嗯,這很奇怪,爲什麼做四個數據庫調用?有沒有一種方法可以讓它在一次數據庫調用中獲得兩個?

回答

17

這似乎很奇怪,因爲索引到查詢集的工作原理。

c = list(Car.objects.filter(id__in=(1,2))) # query 
print(c[0].license + c[0].vin) #no query 
print(c[1].license + c[1].vin) #no query 

如果你做到以下幾點,你只有一個查詢過:

for car in Car.objects.filter(id__in=(1,2)): 
    print(car.license + car.vin) 

正如@Torsten說,在您的情況看來像你只是試圖讓所有你創造的汽車。這可以通過all()方法實現:

for car in Car.objects.all(): 
    print(car.license + car.vin) 
+1

嗯,這是愚蠢的。我需要做的就是在它前面放一個列表()。瘋。謝謝!對於額外的業力:任何人都可以解釋爲什麼需要list()以及爲什麼它不會啓動查詢? – user749618 2011-06-14 00:54:04

+1

那麼當你將一個查詢集編入索引時,它會認爲你只想從該查詢集中找到單個項目,所以它不會爲整個項目執行查詢,它只會爲你想要的單個項目執行一個查詢。但是,是的,我可以看到它看起來很奇怪:( – 2011-06-14 00:56:06

+1

也可以考慮使用'Car.objects.all()'而不是'filter'來獲取數據庫中的所有對象。 – 2011-06-14 01:30:03

4

很好的例子。儘管在最後一個代碼塊中我認爲這是一個錯字。應該是:

for car in Car.objects.filter(id__in=(1,2)): 
    print(car.license + car.vin) 

那如何方法疊起來

+0

哎呀,對了,謝謝。 – 2011-06-14 01:32:27