作为一名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 one和this 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)
答案 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
个实例
参考文献: