不带时区的Django查询注释
我尝试使用Django的查询对象编写以下查询:不带时区的Django查询注释,django,postgresql,timezone,annotate,Django,Postgresql,Timezone,Annotate,我尝试使用Django的查询对象编写以下查询: all_proposals2 = Proposal.objects.raw( "select *, vote_score/extract('epoch' from age(created)) as display_rank from proposals_proposal") 这就是我想到的: all_proposals = Proposal.objects.annotate( display_rank=F('vote_score') /
all_proposals2 = Proposal.objects.raw(
"select *, vote_score/extract('epoch' from age(created)) as display_rank from proposals_proposal")
这就是我想到的:
all_proposals = Proposal.objects.annotate(
display_rank=F('vote_score') / Extract(Func(F('created'), function='AGE'), 'epoch'),
)
但它会生成以下查询:
SELECT
"proposals_proposal"."id",
...
("proposals_proposal"."vote_score" /
EXTRACT('epoch' FROM AGE("proposals_proposal"."created") AT TIME ZONE 'America/Los_Angeles')) AS "display_rank"
FROM
"proposals_proposal"
ORDER BY
"proposals_proposal"."created" ASC
这不是有效的查询。Postgres给出了以下错误:
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
但是它非常接近正确,除了在AGE()
函数调用后附加了时区“America/Los_Angeles”的。如何更改查询以使其不具有此时区规范?在查看了应用此时区规则的方法后,我意识到我必须使用generalFunc
编写此提取调用
all_proposals = Proposal.objects.annotate(
display_rank=ExpressionWrapper(F('vote_score') / Func(
Func(F('created'), function='AGE'),
function='EXTRACT',
template='%(function)s(epoch from %(expressions)s)',
), output_field=FloatField()),
)
这绕过了任何自动时区规范。您是否尝试过使用\u TZ=False
?设置使用\u TZ=False
可以修复查询,但我希望时区位于所有其他相关位置。在这个查询中,它将时区应用于一个不应该有时区的间隔。