2

Django ORMで再作成しようとしているこのクエリがあります。

select
    count(tickets.id),
    date
from
    tickets,
    generate_series('2000-01-01', date_trunc('month', CURRENT_DATE), interval '1 month') as date
where
    (date >= created AND date < resolved)
group by
    date;

私はこれに近いと思います:

tkts = Ticket.objects.extra(
    tables=["generate_series('2000-01-01', date_trunc('month', CURRENT_DATE), interval '1 month') as date"],
    where=["(date >= created AND date < resolved)"],
    order_by=['date'],
).values('date').annotate(cnt=Count('id'))

しかし、私はエラーが発生します:

FieldError: キーワード 'date' をフィールドに解決できません。

クエリをこれに減らすと:

tkts = Ticket.objects.extra(
    tables=["generate_series('2000-01-01', date_trunc('month', CURRENT_DATE), interval '1 month') as date"],
    where=["(date >= created AND date < resolved)"])

テーブルの値がエスケープされ、二重引用符で囲まれていることがわかります (from connections[app].queries:

'SELECT ...
FROM 
  "tickets",
  "generate_series(\'2000-01-01\', date_trunc(\'month\', CURRENT_DATE), interval \'1 month\') as date"
WHERE
 ("tickets"."queue" IN (1,2,3) AND
 ((date >= created AND date < resolved)))
ORDER BY "tickets"."created" DESC LIMIT 21'

mark_safeこれを回避するために使用できるようなものはありますか?ストアド プロシージャを作成してそれらを置き換えることができるgenerate_seriesと思いますが、可能であればデータベースを変更したくありません。

4

0 に答える 0