如何用天数计算注释 Django 查询?

Cer*_*rin 2 python django django-orm

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

我想根据优先级乘以记录创建以来的天数的组合指标来排序表。

为了获得日期注释,我正在尝试执行以下操作:

qs = qs.annotate(days=(ExtractDay(Now()-F('created_datetime'))))
Run Code Online (Sandbox Code Playgroud)

但是,这会引发错误:

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.
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?

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

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

我的数据库后端是 PostgreSQL。

Abd*_*kat 5

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

from django.db.models import DurationField, ExpressionWrapper

qs = qs.annotate(days=(ExtractDay(ExpressionWrapper(Now() - F('created_datetime'), output_field=DurationField()))))
Run Code Online (Sandbox Code Playgroud)