当前位置: 首页 > 面试题库 >

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

邹英光
2023-03-14
问题内容

我正在尝试这样计算一个球员每周玩的次数:

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'))


 类似资料:
  • 问题内容: 我正在尝试在MySQL选择查询中使用一条语句。 我在第一个语句之后出现错误。 为什么这不起作用?在MySQL查询中执行IF语句的正确方法是什么? 问题答案: 您使用的IF / THEN / ELSE构造仅在存储过程和函数中有效。您的查询将需要重组,因为您不能使用IF()函数来控制WHERE子句的流程。 可以在查询中使用的IF()函数主要用于在查询的SELECT部分​​中根据某些条件选择

  • 我尝试为特定的查找我的实体。我的实体知道一周中的几天作为集合,知道两个作为开始和结束。 我的实体是这样的: 当我运行调用方法的测试时,我得到以下信息: 我搜索了一些关于如何在中正确使用panache的信息,但不幸的是,我没有找到任何信息。

  • 问题内容: 我有5个表或表要从\查询 我的语法我喜欢这样 问题是,当我运行此命令时,我收到一条错误消息:“ .....您在SQL WHERE Patient_ID =吗?附近有错误?” 当我使用system.out.println(sql2)输出sql时; 值未在sql2中设置 问题答案: 当您准备一条语句时,数据库将构造一个执行计划,如果表不存在,则该计划无法执行。换句话说,Placehodle

  • 问题内容: 我需要执行django查询,以检查字段是否包含列表中的所有值。该列表的长度将有所不同 例 问题答案: 对于python 3

  • 问题内容: 我有一个用户表,其中有一个用户名和应用程序列。用户名可以重复,但是用户名+应用程序的组合是唯一的,但是我没有在表上设置唯一约束(出于性能考虑) 问题:两者之间是否有任何区别(在性能方面): 和 - 由于用户名+应用程序的组合是唯一的,因此两个查询将始终返回不超过一条记录,因此TOP 1不会影响结果。我一直以为添加TOP 1会真正加快速度,因为sql server会停止寻找匹配的内容,但

  • 我正在尝试使用. as()在coalesce()中的第二个遍历中访问之前保存的遍历,如下所示: 查询更新边缘(如果存在/创建,则更新边缘) Java代码: 抛出如下错误:(为了简洁而精确) gremlin.driver.exception。ResponseException:提供的遍历器未映射到值[停止] 当我将最后一个步骤替换为下面的工作状态时(而不是别名再次查询顶点) 替换为 带addE('l