2013-01-09 71 views
6

需要爲每個作者(與外鍵相關)的第一本書(通過日期字段)獲得一個查詢集...是否有Django ORM方法來做到這一點(沒有自定義的SQL首選,但可以接受)Django queryset返回基於日期的外鍵每個項目的第一個

*編輯:請注意,一個只適用於現代開放源碼後端像Postgresql的答案是可接受的..靜態ORM爲基礎的解決方案首選純自定義SQL查詢)

Models 
class Book(Model): 
    date = Datefield() 
    author = ForeignKey(Author) 

class Author(Model): 
    name = CharField() 


Book.objects.filter(??) 
+0

我有幾乎相同的問題昨天http://stackoverflow.com/questions/14213333/get-latest-objects-django。在編輯2部分是我目前的黑客。 –

+0

嗯,我在PostgreSQL上,所以我不受限於獨特的...我不知道如果我可以根據您的問題找到我的答案...感謝指針 – eskhool

回答

6

如果你使用PostgreSQL或其他數據庫後端,可支持DISTINCT ON有一個很好的解決方案:

Books.objects.order_by('author', '-date').distinct('author') 

否則我不知道只有一個查詢的解決方案。不過你可以試試這個:

from django.db.models import Q, Max 
import operator 

books = Book.objects.values('author_id').annotate(max_date=Max('date')) 
filters = reduce(operator.or_, [(Q(author_id=b['author_id']) & 
    Q(date=b['max_date'])) for b in books]) 
queryset = Books.objects.filter(filters) 

有().values的組合和.annotate(),我們組由作者和註釋的從作者的所有書籍的最後日期。但結果是字典而不是查詢集。 然後我們建立一個SQL語句,如WHERE author_id=X1 AND date=Y1 OR author_id=X2 AND date=Y2...。現在第二個查詢很容易。

+0

謝謝,我知道2查詢回覆...這可能是我想要接受的答案,因爲它已經詳細地討論了具體的問題,但我仍然希望Django ORM與自定義sql可能允許這發生在單個查詢 – eskhool

+0

然後我假設你想在單個查詢中爲所有數據庫後端提供解決方案?像這樣:'Book.objects.raw('SELECT *,MAX(date)as max_date FROM myapp_book GROUP BY author_id')'? – Hannes

+0

更新了我的問題,僅適用於postgresql解決方案...即使它不適用於所有後端,仍然更願意使用基於ORM的解決方案...自定義sql只會導致進一步鏈接困難 – eskhool

相關問題