2012-06-27 72 views
3

我有一個Read模型是與Article模型相關。我想要做的是製作一個查詢集,其中的文章是唯一的,並且由date_added訂購。由於我使用的是postgres,我傾向於使用.distinct()方法並指定article字段。像這樣:Django .order_by()與.distinct()使用postgres

articles = Read.objects.order_by('article', 'date_added').distinct('article') 

但是,這並沒有給出預期的效果,並且按照它們創建的順序對查詢集進行排序。我知道Django文檔中關於.distinct().order_by()的注意事項,但是我不認爲它適用於此,因爲它提到的副作用是將會有重複,而我沒有看到它。

# To actually sort by date added I end up doing this 
articles = sorted(articles, key=lambda x: x.date_added, reverse=True) 

此執行之前,我確實需要它,可能會變得非常慢,如果有大量記錄整個查詢。我已經使用select_related()進行了優化。

是否有更好,更有效率的方式來創建具有唯一性的相關模型和order_by日期的查詢?

UPDATE 輸出將理想地讀實例的查詢集,其中它們的相關文章是在查詢集獨特和僅使用Django的ORM(即排序在python)。

+0

你運行的是什麼版本的Django?將參數傳遞給'distinct'只能用於1.4+ –

+0

1.4並使用postgres,它的工作原理 – ender

回答

2

是否有更好,更有效的方式來創建具有唯一性的相關模型和order_by日期的查詢?

可能。如果沒有完整的圖片很難說,但我的假設是,您正在使用Read來跟蹤哪些文章有和沒有被讀取,並且可能將其與User實例綁定以確定特定用戶是否已閱讀文章。如果是這樣,你的方法是有缺陷的。相反,你應該這樣做:

class Article(models.Model): 
    ... 
    read_by = models.ManyToManyField(User, related_name='read_articles') 

然後,以獲取特定用戶的讀條,你可以這樣做:

user_instance.read_articles.order_by('date_added') 

這需要需要使用distinct的方程,因爲現在不會有任何重複。

UPDATE

要獲得由至少一個用戶閱讀所有文章:

Article.objects.filter(read_by__isnull=False) 

或者,如果你想爲普及門檻,您可以使用標註:

from django.db.models import Count 

Article.objects.annotate(read_count=Count('read_by')).filter(read_count__gte=10) 

哪給你只有至少10位用戶閱讀的文章。

+0

感謝您的幫助!這個特定的查詢實際上是跟隨你正在閱讀的多個用戶。我遺漏了另一個這樣做的過濾器。我需要在多個用戶之間進行聚合,因此在這種情況下,查詢Read模型而不是Article模型似乎更有效。那有意義嗎? – ender

+0

請參閱上面的更新。 –

+0

@ChrisPratt在更新的第一個查詢中您有一個錯字:ready_by –