gpt4 book ai didi

python - Django,如何在单个查询集中进行多个注释

转载 作者:太空狗 更新时间:2023-10-29 21:42:45 26 4
gpt4 key购买 nike

我目前正在尝试为 Django 中的用户模型注释两个不同数量的点赞。

这是我用来返回所需查询集的代码

def get_top_user(self):
return User.objects. \
annotate(guide_like=Count('guidelike')).\
annotate(news_like=Count('newslike')).\
values_list('first_name', 'last_name', 'guide_like','news_like').\
order_by('-guide_like')

但是,querySet 返回 ["Bob", "Miller", 612072, 612072]。如您所见,Django 获取两个注释值并将它们相乘,这就是我得到 612072 的原因。

有没有办法在单个 querySet 中调用多个注释而不获取这些相乘的值。

编辑:还尝试在查询末尾添加 distinct() 或在每个计数中添加 distinct=True 但调用只会进入无限循环。

最佳答案

这就是 django annotate 生成 sql 代码的方式:它执行所有必要的连接,然后对所有用户字段进行分组,并使用注释函数(在您的情况下为计数)进行聚合。因此,它将用户与他们所有喜欢的指南、所有喜欢的新闻一起加入,然后简单地计算每个用户产生的行数。

如果可以,你应该使用raw querysets , 或 extra查询集方法。例如:

User.objects.all().extra(select={
'guide_likes': 'select count(*) from tbl_guide_likes where user_id=tbl_users.id',
'news_like': 'select count(*) from tbl_news_likes where user_id=tbl_users.id'
}).\
values_list('first_name', 'last_name', 'guide_like','news_like')

为了更灵活,您可以使用 extra 方法的 select_params 参数来提供表的名称(您可以通过 Model._meta 获取) .顺便说一下,这是一种非常不方便和老套的方法。迟早你的逻辑会变得更加复杂,然后你应该将它从 python 代码中删除到 sql(存储函数/过程)和原始查询。

关于python - Django,如何在单个查询集中进行多个注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30900514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com