没有时区的Django查询注释

我正在尝试使用Django的查询对象编写以下查询:

@EventListener(ApplicationreadyEvent.class)
public void initIndicesAfterStartup() {
    IndexOperations indexOps = mongoTemplate.indexOps(DomainType.class);
    IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
    resolver.resolveIndexFor(DomainType.class).forEach(indexOps::ensureIndex);
}

这是我想出的:

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

这不是有效的查询。 Postgres出现此错误:

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

但是它非常正确,只不过它在HINT: No function matches the given name and argument types. You might need to add explicit type casts. 函数调用后附加了额外的AT TIME ZONE 'America/Los_Angeles'。如何更改查询,使其不具有该时区规范?

mjg1mlf2 回答:没有时区的Django查询注释

在仔细研究了应用此时区规则的source code for the Extract function之后,我意识到我必须用通用的Func来编写此Extract调用。

    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()),)

这会绕过任何自动时区规范。

本文链接:https://www.f2er.com/3134472.html

大家都在问