如何使用 ExpressionWrapper 注释查询集与 today 和 DateField 之间的差异



>我正在尝试根据日期字段对查询集进行注释,如图所示。

我正在使用 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

相关内容

  • 没有找到相关文章

最新更新