Django过滤列之间的日期差异

时间:2018-05-30 09:01:04

标签: python django

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

我有以下型号:

    var scatterChartData = {
        datasets: [{
            label: 'My First dataset',


            data: [

        <?php for($x = 0; $x < $total; $x++){?>

            {
                x: <?= round($data[$x]['PosX'],2);?> ,
                y: <?= round($data[$x]['PosY'],2);?> ,
                color: '<?= ($data[$x]['Value'] > 1)? 'red':'green' ;?>'

            }, 

             <?php }?>  

            ]

        }]
    };

我希望提取持续的比赛,例如超过5天。我可以以某种方式获得timediff专栏:

  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()

现在,如何对此列进行过滤,我尝试的是:

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

但是这一切都给出了:

  

TypeError:期望的字符串或类似字节的对象

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

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()

导致:

  

ProgrammingError:column&#34; tdiff&#34;不存在

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

在最后确定这个问题时,我最终确实得到了我想要的结果:

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

但我仍然非常想知道如何利用这个临时列tdiff。

谢谢!

回答后更新

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

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

1 个答案:

答案 0 :(得分:2)

这会有所作为:

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))

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

参考文献: