如何在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
相关产品推荐
相关产品推荐

