【问题标题】:How to annotate Django query with days calculation?如何用天数计算注释 Django 查询?
【发布时间】:2021-05-21 16:40:54
【问题描述】:

如何使用自记录创建以来的天数计算对表的 Django 查询进行注释?

我想根据优先级组合指标乘以自记录创建以来的天数来订购表格。

为了获得日期注释,我正在尝试这样做:

qs = qs.annotate(days=(ExtractDay(Now()-F('created_datetime'))))

但是,这是抛出错误:

django.db.utils.ProgrammingError: function pg_catalog.timezone(unknown, interval) does not exist
LINE 1: ...EMENT_TIMESTAMP() - "myapp_mymodel"."created_timestamp") AT TIME ZO...
                                                         ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

我尝试过类似的Extract() 函数,但它也会产生类似的错误。

我做错了什么?

从表面上看,我只需要执行 Django 等效的 EXTRACT(DAY FROM NOW() - created_timestamp),但 Django 的 Extract(..., 'days') 和 ExtractDay() 函数似乎与 PostgreSQL 等效函数实际上并不匹配。

看起来 Django 的 Now() 返回的值和我的时间戳字段都是时区感知时间戳,那么为什么数据库会抱怨类型不兼容?

我的数据库后端是 PostgreSQL。

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    您的查询需要指定 Now() - F('created_datetime') 的输出类型,因为两者都是日期时间,所以 Django 假定输出也是日期时间(此处为 False,但在其他情况下正常工作),因此您应该使用 @987654321 @并提供output_field:

    from django.db.models import DurationField, ExpressionWrapper
    
    qs = qs.annotate(days=(ExtractDay(ExpressionWrapper(Now() - F('created_datetime'), output_field=DurationField()))))
    

    【讨论】:

    • 完美运行。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2016-04-04
    • 1970-01-01
    • 2019-09-23
    • 2020-07-20
    • 2019-02-01
    • 2022-01-19
    相关资源
    最近更新 更多