Python 按外键和返回模型django进行计数和分组 数据模型: 每个库都有许多书 每个书籍可能由用户阅读,也可能不由用户书籍收据 目标:

Python 按外键和返回模型django进行计数和分组 数据模型: 每个库都有许多书 每个书籍可能由用户阅读,也可能不由用户书籍收据 目标:,python,sql,django,postgresql,Python,Sql,Django,Postgresql,给定一个用户,根据他们在每个图书馆读过多少书来订购图书馆 例子: 用户1已阅读: 图书馆的2本书1 图书馆的5本书2 图书馆的一本书3 图书馆4中的0本书 我们应该按照用户1阅读的图书数量的顺序归还图书馆,即: Library 2, Library 1, Library 3 当前解决方案 实际产量 预期产量 您需要更改处理查询集的方式。使用Library而不是userbookreceive libraries = (Library.objects .filter(book__use

给定一个用户,根据他们在每个图书馆读过多少书来订购图书馆

例子: 用户1已阅读:

  • 图书馆的2本书1
  • 图书馆的5本书2
  • 图书馆的一本书3
  • 图书馆4中的0本书
我们应该按照用户1阅读的图书数量的顺序归还图书馆,即:

Library 2, Library 1, Library 3
当前解决方案 实际产量 预期产量
您需要更改处理查询集的方式。使用
Library
而不是
userbookreceive

libraries = (Library.objects
    .filter(book__userbookreceipt__user=user)
    .annotate(rcount=Count('book__userbookreceipt', distinct=True))
    .order_by('-rcount')
)
[x.rcount for x in libraries]

如果你打算使用SQL,你真的应该使用正确的、明确的、标准的
JOIN
语法。为什么?AFAIK的
语法在性能方面等同于
内部连接
[
    {'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}
]
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
libraries = (Library.objects
    .filter(book__userbookreceipt__user=user)
    .annotate(rcount=Count('book__userbookreceipt', distinct=True))
    .order_by('-rcount')
)
[x.rcount for x in libraries]