繁体   English   中英

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

[英]Django, How to make multiple annotate in a single queryset

我目前正在尝试在Django中为User模型注释两个不同数量的喜欢。

这是我用来返回所需querySet的代码

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代码的方式:它执行所有必要的连接,然后在所有用户字段上进行分组,与注释函数聚合(在您的情况下计数)。 因此,它将所有指南喜欢的用户加入用户,然后加入所有新闻喜欢,然后简单地计算每个用户生成的行数。

如果可以,您应该使用原始查询集extra Queryset方法。 例如:

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获得)。 顺便说一句,这是非常不方便和hackish方法。 你的逻辑迟早会变得更加复杂,然后你应该将它从python代码中删除到sql(存储的函数/过程)和原始查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM