gpt4 book ai didi

Django 查询以反向关系聚合赞成票

转载 作者:行者123 更新时间:2023-12-02 03:42:04 24 4
gpt4 key购买 nike

我有两个模型:

Base_Activity:
some fields

User_Activity:
user = models.ForeignKey(settings.AUTH_USER_MODEL)
activity = models.ForeignKey(Base_Activity)
rating = models.IntegerField(default=0) #Will be -1, 0, or 1

现在我想查询 Base_Activity,并将具有最多相应用户事件且 rating=1 的项目排在最前面。我想做类似下面查询的事情,但是 =1 部分显然不起作用。

activities = Base_Activity.objects.all().annotate(
up_votes = Count('user_activity__rating'=1),
).order_by(
'up_votes'
)

我该如何解决这个问题?

最佳答案

您不能像那样使用 Count,如错误消息所述:

SyntaxError: keyword can't be an expression

Count 的参数必须是一个简单的字符串,例如user_activity__rating

我认为一个好的替代方法是同时使用 AvgCount:

activities = Base_Activity.objects.all().annotate(
a=Avg('user_activity__rating'), c=Count('user_activity__rating')
).order_by(
'-a', '-c'
)

rating=1 事件最多的项目应该具有最高的平均值,并且在具有相同平均值的用户中,事件最多的项目将被列在较高的位置。

如果你想排除有反对票的项目,请确保在 annotate 之后添加适当的 filterexclude 操作,例如:

activities = Base_Activity.objects.all().annotate(
a=Avg('user_activity__rating'), c=Count('user_activity__rating')
).filter(user_activity__rating__gt=0).order_by(
'-a', '-c'
)

更新

要获取所有项目,按他们的赞成票排序,忽略反对票,我认为唯一的方法是使用原始查询,如下所示:

from django.db import connection

sql = '''
SELECT o.id, SUM(v.rating > 0) s
FROM user_activity o
JOIN rating v ON o.id = v.user_activity_id
GROUP BY o.id ORDER BY s DESC
'''
cursor = connection.cursor()
result = cursor.execute(sql_select)
rows = result.fetchall()

注意:不要硬编码模型的表名,而是从模型中获取表名,例如,如果您的模型名为 Rating,那么您可以通过 Rating._meta.db_table.

我在 sqlite3 数据库上测试了这个查询,我不确定那里的 SUM 表达式是否适用于所有 DBMS。顺便说一句,我有一个完美的 Django 站点来测试,我也在其中使用了赞成票和反对票。我使用非常相似的模型来计算赞成票和反对票,但我按 sum 值(stackoverflow 样式)对它们进行排序。 siteopen-source ,如果您有兴趣的话。

关于Django 查询以反向关系聚合赞成票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19454856/

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