[英]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.