gpt4 book ai didi

django - 如何使用 ExpressionWrapper 注释具有今天和 DateField 之间差异的查询集

转载 作者:行者123 更新时间:2023-12-04 13:00:49 26 4
gpt4 key购买 nike

我正在尝试根据所示的 DateField 对查询集进行注释。

我使用的是 Django 1.8.12 版和 MYSQL 5.6.40 版。

试过以下 How to annotate a queryset with number of days since creation ,但这里是一个 DateTimeField。下面的评论说“将其更改为 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()))

当我尝试打印时,在此期间我得到的只是 None 。差异打印以供引用。

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

我希望持续时间是一个 timedelta 值,与今天和 trans_date 之间的差异而不是 None。

最佳答案

这对我有用(带有 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
在一些具有 native DurationField 支持的数据库中,我相信您可以执行以下操作将天提取为 int 字段,这将允许分组等,
但这在 SQLite 中不受支持。
due_in_days = ExtractDay(due_in)
qs = Test.objects.annotate(due_in_days=due_in_days) # result is int

关于django - 如何使用 ExpressionWrapper 注释具有今天和 DateField 之间差异的查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com