[英]Django filter on date difference between columns
作為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天的比賽。 我可以以某種方式獲得timediff專欄:
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:期望的字符串或類字節對象
然后我考慮使用extra來獲取where子句:
set2 = Race.objects.annotate(tdiff=F('end')-F('start'))
set2.first().tdiff
set2.all().extra(where=['tdiff>=5'])
導致:
ProgrammingError:列“tdiff”不存在
同一方向的問題包括這一個和這一個,但沒有真正給出一個解決方案,你過濾新的列(這里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
實例
參考文獻:
ExpressionWrapper
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.