python - 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate()?

标签 python mysql django django-queryset django-aggregation

我正在尝试计算玩家每周玩的次数,如下所示:

player.game_objects.extra(
    select={'week': 'WEEK(`games_game`.`date`)'}
).aggregate(count=Count('week'))

但 Django 提示

FieldError: Cannot resolve keyword 'week' into field. Choices are: <lists model fields>

我可以像这样在原始 SQL 中做到这一点

SELECT WEEK(date) as week, COUNT(WEEK(date)) as count FROM games_game
WHERE player_id = 3
GROUP BY week

有没有在 Django 中不执行原始 SQL 的好方法?

最佳答案

您可以使用自定义聚合函数来生成查询:

WEEK_FUNC = 'STRFTIME("%%%%W", %s)' # use 'WEEK(%s)' for mysql

class WeekCountAggregate(models.sql.aggregates.Aggregate):
    is_ordinal = True
    sql_function = 'WEEK' # unused
    sql_template = "COUNT(%s)" % (WEEK_FUNC.replace('%%', '%%%%') % '%(field)s')

class WeekCount(models.aggregates.Aggregate):
    name = 'Week'
    def add_to_query(self, query, alias, col, source, is_summary):
        query.aggregates[alias] = WeekCountAggregate(col, source=source, 
            is_summary=is_summary, **self.extra)


>>> game_objects.extra(select={'week': WEEK_FUNC % '"games_game"."date"'}).values('week').annotate(count=WeekCount('pk'))

但由于此 API 未记录在案并且已经需要一些原始 SQL,您最好使用 raw query .

关于python - 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4567543/

相关文章:

python - MySQL 连接对象的属性错误

Python - 编辑 CSV 文件中的特定单元格

mysql - 根据其他行的条件选择行

mysql - 外键和 MySQL 错误

django - Django 模板中的静态文本到动态文本

python - 错误 : "can only concatenate tuple (not "list") to tuple"in urls, Django

python - Django LDAP 身份验证失败 : SERVER_DOWN

python - 仅替换一定数量的字符

python - 为 python3 安装 venv

c# - session 未在页面之间传递c#