Django クエリで .extra(select={...}) を使用して導入された値に .aggregate() を使用しますか? 質問する

Django クエリで .extra(select={...}) を使用して導入された値に .aggregate() を使用しますか? 質問する

次のようにして、プレイヤーが毎週プレイした回数を取得しようとしています。

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

しかし、ジャンゴは不満を漏らす

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 を実行せずにこれを行う良い方法はありますか?

ベストアンサー1

カスタム集計関数を使用してクエリを生成することもできます。

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の一部を必要とするため、生のクエリ

おすすめ記事