>我正在尝试根据日期字段对查询集进行注释,如图所示。
我正在使用 Django 版本 1.8.12 和 MYSQL 版本 5.6.40。
尝试按照如何注释查询集自创建以来的天数,但这里是日期时间字段。下面的评论说"将其更改为 Value(now.date((, DateField((( - F('creation_date__date'(,不起作用">
型号代码如下所示:
class Holding(models.Model):
trans_date = models.DateField(_("Trans. Date"), null=False)
...
给出错误持续时间的注释查询如下所示:
today = timezone.now().date()
testqs = Holding.objects.filter(id=1)
myqs = testqs.annotate(duration = ExpressionWrapper( Value(today, DateField()) - F('trans_date'), output_field=DurationField()))
当我尝试打印时,我得到的只是持续时间内的无。差异打印以供参考。
for i in myqs:
print i.duration, '-', today-i.trans_date
None - 1224 days, 0:00:00
None - 1206 days, 0:00:00
None - 1144 days, 0:00:00
None - 1051 days, 0:00:00
None - 1045 days, 0:00:00
我希望持续时间是一个时间增量值,今天和trans_date之间的差异,而不是无。
这对我有用(带有SQLite的Django 2.2.20(:
import datetime as dt
from django import models
from django.db.models import F, ExpressionWrapper, fields
from django.db.models.functions import Now, TruncDate
class Test(models.Model):
due_date=models.DateField(null=True, blank=True, default=dt.date.today)
due_in = ExpressionWrapper(
F('due_date') - TruncDate(Now()),
output_field=fields.DurationField())
qs = Test.objects.annotate(due_in=due_in) # due_in will be dt.timedelta
在一些支持本机 DurationField 的数据库中,我相信您可以执行以下操作将天数提取为 int 字段,这将允许分组等, 但这在SQLite中不受支持。
due_in_days = ExtractDay(due_in)
qs = Test.objects.annotate(due_in_days=due_in_days) # result is int