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。
您的查询需要指定输出的类型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)
| 归档时间: |
|
| 查看次数: |
1431 次 |
| 最近记录: |