我正在尝试使用以下列查询django中的数据库表:
id | start_time | end_time
我可以直接在查询中获得差异,而不是获取两者的单独值吗? 有这样的效果:
SELECT id, Diff(start_time, end_time) FROM myTable
答案 0 :(得分:3)
这可以通过Django 1.10及以上的ORM完全完成。使用这样的模型:
class Timer(models.Model)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
您可以使用以下持续时间注释对象:
from django.db.models import DurationField, ExpressionWrapper, F
Timer.objects.annotate(duration=ExpressionWrapper(F('end_time') - F('start_time'),
output_field=DurationField()))
答案 1 :(得分:2)
QuerySet.extra()
将允许您为列指定任意表达式。请注意,结果将取决于DB。
答案 2 :(得分:1)
在我看来,最简单的方法是添加带有差异的第三列,并在每次修改对象时更新它:
class Timer(models.Model)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
diff_time = models.DateTimeField()
def __init__(self, *args, **kwargs):
super(Timer, self).__init__(*args, **kwargs)
self.diff_time = self.end_time - self.start_time
def save(self, *args, **kwargs):
self.diff_time = self.end_time - self.start_time
super(Timer, self).save(*args, **kwargs)
我试图寻找带注释的解决方案,但是在mysql和postgres中都不支持聚合函数。即使在那里,看起来很好的交易额外的列,因为不必为每个查询的每一行计算差异!
哦,你可以像这样找回你想要的东西:
Timer.objects.values('id', 'diff_time')
答案 3 :(得分:0)
自Django 1.8起,extra
is discouraged赞成annotate
+ RawSQL
。以下适用于MySQL:
res = MyTable.objects.annotate(duration=RawSQL('datediff(endtime, starttime)', ()))
# examine the results
print res.values_list('duration', 'starttime', 'endtime')