You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django查询中注解记录创建距今天数并解决PostgreSQL报错

问题原因
  • 两个时间戳做减法在PostgreSQL中返回interval(时间间隔)类型,而Django的ExtractDay默认会对输入参数自动拼接时区转换逻辑,该逻辑仅支持时间戳类型,传入interval类型就会触发类型不匹配报错
  • 你没有给减法结果显式指定输出类型,Django无法识别这是时间间隔,错误套用了时间戳的处理逻辑
解决方案

方案1:原生SQL注解(最简洁高效)

直接用PostgreSQL原生语法实现需求,不用适配Django的函数封装:

from django.db.models.expressions import RawSQL

qs = qs.annotate(
    days=RawSQL("EXTRACT(DAY FROM NOW() - created_datetime)", [])
)

方案2:纯Django ORM实现(无原生SQL)

先通过ExpressionWrapper显式指定时间差为时间间隔类型,再提取天数:

from django.db.models import F, ExpressionWrapper, DurationField
from django.db.models.functions import ExtractDay, Now

qs = qs.annotate(
    time_diff = ExpressionWrapper(
        Now() - F('created_datetime'),
        output_field=DurationField()
    )
).annotate(
    days = ExtractDay('time_diff')
)
排序实现

拿到天数字段后,直接按你的需求计算组合指标排序即可:

qs = qs.annotate(
    sort_score = F('priority') * F('days')
).order_by('-sort_score')

内容的提问来源于stack exchange,提问作者Cerin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 10:51:01