簡體   English   中英

Django過濾列之間的日期差異

[英]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實例

參考文獻:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM