2009-11-23 27 views
2

我需要在Django中構建一個查詢,並且我想知道這是否有可能(可能很明顯,但我錯過了它... )。基於Django中的數據庫中的某個字段獲取不同的行基於Django中的數據庫獲取不同的行

我有一個正常的查詢Model.objects.filter(x=True)[:5]可以返回這樣的結果:

 
FirstName LastName Country 
Bob   Jones  UK 
Bill   Thompson  UK 
David   Smith  USA 

我只需要搶行基礎上,Country的字段,它是不同的,像Model.objects.filter(x=True).distinct('Country')[:5]將是理想的,但是這是不可能的Django的。

我希望查詢最終搶到的行是:

 
FirstName LastName Country 
Bob   Jones  UK 
David   Smith  USA 

我還需要查詢中使用的模型的元級(即設置相同的排序,我不能覆蓋排序任何方式)。

我怎麼會去這樣做呢?

非常感謝。

+0

我只需要數據庫的前五行。 – Dx143 2009-11-23 17:36:47

+0

這是一個艱難的,但我不確定我完全理解這個問題。你想要國家獨特的前五排嗎? – jathanism 2009-11-23 17:53:56

+0

嗨,是的,我確實:)。 – Dx143 2009-11-23 18:27:57

回答

0
countries = [f.country in Model.objects.all()] 

for c in countries: 
    try: 
     print Model.objects.filter(country=c) 
    except Model.DoesNotExist: 
     pass 
0

我認爲@skrobul是在正確的軌道上,但有點關閉。

我不認爲你可以用單個查詢來做到這一點,因爲distinct()方法將SELECT DISTINCT修飾符添加到查詢中,該查詢作用於整行。您可能必須創建一個國家/地區列表,然後根據迭代該列表返回有限的QuerySets。

事情是這樣的:

maxrows = 5 
countries = set([x.country for x in Model.objects.all()]) 
rows = [] 
count = 0 
for c in countries: 
    if count >= maxrows: 
     break 

    try: 
     rows.append(Model.objects.filter(country=c)[0]) 
    except Model.DoesNotExist: 
     pass 

    count += 1 

這是一個很普通的例子,但它給了預期的結果。

4

我沒有測試過這一點,但它似乎對我的字典應該做的工作,雖然訂貨會被關閉,那麼:

d = {} 
for x in Model.objects.all(): 
    d[x.country] = x 

records_with_distinct_countries = d.values() 
+0

同樣的事情可以通過捕獲'set'中的值來執行。 – jathanism 2009-11-23 19:12:38

+1

不是。這些國家可以放在一起,因爲它們是不變的。但是模型絕對不是一成不變的,所以不能成爲一個集合。這就是爲什麼我使用字典,不可改變的國家作爲關鍵,並將價值記錄。我碰巧使用了字典密鑰作爲一個集合(它在概念上),而不會丟失記錄。 – extraneon 2009-11-23 21:14:09

0

你能後的原始SQL返回你從想要什麼源數據庫?我有一個預感,這裏的實際問題是查詢/數據結構...

相關問題