2012-06-01 48 views
38

我試圖讓不同的外鍵的列表,我寫了這個:Django的模型 - 獲取不同的值列表

my_ids = Entity.objects.values('foreign_key').distinct() 

但我得到的只是一個UNDISTINCT的外鍵列表...我缺少什麼?

謝謝!

回答

28

這就是提示!這兩種解決方案不會工作100%......但我有種結合他們:)

將參數傳遞給不同的does not工作爲MySQL的數據庫(據我所知)

這一個工程,並返回只有一個目標:

Entity.objects.order_by('foreign_key').values('foreign_key').distinct()

但我還是謝謝你:)

+4

我在Postgres9.1數據庫Django == 1.5.5上遇到同樣的問題。添加order_by幫助 - 愚蠢的... – kev

31

也許你會想要去與此:

Entity.objects.order_by().values_list('foreign_key', flat=True).distinct() 
+7

錯了。在沒有order_by('foregin_key')的情況下使用時不會工作。例如在M2M(postgres,django 1.8) – andi

3
Entity.objects.order_by('foreign_key').distinct('foreign_key') 

如果你已經有了他們作爲一個列表,然後將其轉換爲set()得到不同的值。

+0

是不是這種轉換爲集是一個昂貴的想法相對於內存與set()一切都會被填充內存中,因爲查詢集其尚未加載,直到其評估..這種轉換爲列表的東西也會評估查詢集? –

15
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by() 

不同的

以無序方式不起作用

在SQL SELECT 列中包含在order_by()調用中使用的任何字段。這在使用 與distinct()結合使用時有時會導致意想不到的結果。如果您通過相關 模型的字段進行排序,這些字段將被添加到選定的列中,並且它們可能會使得重複行看起來不同。由於額外的 列不會出現在返回的結果中(它們僅支持 支持排序),所以它有時看起來像非返回結果是 。

同樣,如果您使用的值()查詢來限制 選擇,()在任何ORDER_BY使用的列(或默認模型 排序)仍然會被涉及的列,並可能影響唯一性 結果。

這裏的道德是,如果你使用distinct()注意相關模型的排序 。同樣,將distinct()和 values()一起使用時,在按值()調用不在 中的字段排序時要小心。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

+0

你能詳細解釋一下嗎?考慮到這個問題的投票率,這對很多人來說都是一個問題。你說這個的來源是什麼? –

+0

我幾乎失去了我的想法。感謝您的解決方案! – Crystal