gpt4 book ai didi

python - Django 过滤列之间的日期差异

转载 作者:太空狗 更新时间:2023-10-30 02:53:10 26 4
gpt4 key购买 nike

作为 Django 初学者,我遇到了一个非常基本的问题:根据两列的日期差异过滤表格。我可以用原始 SQL 解决这个问题,但我真的想使用基本的 Django 函数。

我有以下模型:

  from django.db import models
import datetime

class Race(models.Model):
__tablename__ = 'race'
name = models.CharField(max_length=200)
country = models.CharField(max_length=100, null=True)
start = models.DateField()
end = models.DateField()

我想提取持续的比赛,例如超过5天。我可以以某种方式获得时间差异列:

Race.objects.annotate(tdiff=F('end')-F('start')).first()
set1 = Race.objects.annotate(tdiff=F('end')-F('start')).all()
set1.first().tdiff

现在,我该如何过滤这一列,我尝试的是:

min_diff = datetime.timedelta(5)
set1.filter(tdiff__gte=5).first()
set1.all().filter(tdiff__gte=min_diff)
set1.filter(tdiff__gte=min_diff).first()

但这一切都给出了:

TypeError: expected string or bytes-like object

然后我考虑使用 extra 来获取一个 where 子句:

set2 = Race.objects.annotate(tdiff=F('end')-F('start'))
set2.first().tdiff
set2.all().extra(where=['tdiff>=5'])

导致:

ProgrammingError: column "tdiff" does not exist

同方向的问题有this onethis one但没有一个真正提供在新列(此处为 tdiff)上进行过滤的解决方案。


当完成这个问题时,我最终确实得到了我想要的结果:

Race.objects.filter(end__gte=F("start")+5)
print(Race.objects.filter(end__gte=F("start")+5).query)

但我还是很想知道如何利用这个临时列tdiff。

谢谢!


回答后更新

接受的答案正是我想要的:

from django.db.models import DurationField, F, ExpressionWrapper
import datetime

set4 = Race.objects.annotate(
diff=ExpressionWrapper(F('end') - F('start'), output_field=DurationField())).filter(
diff__gte=datetime.timedelta(5))
len(set4)
# 364
len(Race.objects.filter(end__gte=F("start")+5))
# 364

最佳答案

这会产生魔力:

from django.db.models import DurationField, F, ExpressionWrapper
import datetime

Race.objects.annotate(
diff=ExpressionWrapper(F('end') - F('start'), output_field=DurationField())
).filter(diff__gte=datetime.timedelta(5))

这将返回持续时间大于或等于 5 的所有 Race 实例

引用资料:

关于python - Django 过滤列之间的日期差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600531/

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