[英]Count and group by foreign key and return model django
Library
都有許多Book
UserBookReceipt
指示User
可能閱讀或不閱讀每Book
對於給定的用戶,請按他們在每個圖書館看過多少書來訂購圖書館。
用戶1已閱讀:
我們應該按用戶1閱讀的書籍數量的順序返回庫,即:
Library 2, Library 1, Library 3
libraries = (UserBookReceipt.objects
.filter(user=user)
.values('book__library')
.annotate(rcount=Count('book__library'))
.order_by('-rcount')
)
[
{'book_library': 2, 'rcount': 5},
{'book_library': 1, 'rcount': 2},
{'book_library': 3, 'rcount': 1}
]
[
{'book_library': <Library: 2>, 'rcount': 5},
{'book_library': <Library: 1>, 'rcount': 2},
{'book_library': <Library: 3>, 'rcount': 1}
]
實際輸出是我想要的輸出的90%,除了我希望book_library
值是django Library
模型的實例,而不僅僅是庫ID。 否則,我必須進行另一個查詢來檢索Library
對象,這可能需要在查詢中使用一些低效的ids__in
。
如何按UserBookReceipt.book__library
計數和分組並返回Library模型?
如果我要在SQL中執行此操作,查詢將如下所示
with rcount_per_lib as (
select lib.id, count(*) as rcount
from lib, books, user_book_receipts
where user_book_receipts.book_id = books.id
and lib.id = books.lib_id
and user_book_receipts.user_id = 1
group by lib.id)
select lib.*, rcount from rcount_per_lib
where lib.id = rcount_per_lib.id
order by rcount
您需要更改處理查詢集的方式。 使用Library
而不是UserBookReceipt
。
libraries = (Library.objects
.filter(book__userbookreceipt__user=user)
.annotate(rcount=Count('book__userbookreceipt', distinct=True))
.order_by('-rcount')
)
[x.rcount for x in libraries]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.