簡體   English   中英

按外鍵計數和分組並返回模型django

[英]Count and group by foreign key and return model django

資料模型:

  • 每個Library都有許多Book
  • UserBookReceipt指示User可能閱讀或不閱讀每Book

目的:

對於給定的用戶,請按他們在每個圖書館看過多少書來訂購圖書館。

例:

用戶1已閱讀:

  • 2圖書館書籍1
  • 5圖書館的書籍2
  • 1本書來自圖書館3
  • 0圖書館的書4

我們應該按用戶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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM