我正在尝试在django中查询数据库表,其中包括以下列:
id | start_time | end_time
而不是获得两个单独的值,我可以直接在查询中获得差异吗?以下内容:
SELECT id, Diff(start_time, end_time) FROM myTable
这可以完全通过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()))
QuerySet.extra()
将允许您为列指定任意表达式。注意,结果将依赖于db。
在我看来,最简单的方法是添加具有差异的第三列,并在每次修改对象时更新它,像这样:
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')
从Django 1.8开始,不支持extra
而支持annotate
+ RawSQL
。
res = MyTable.objects.annotate(duration=RawSQL('datediff(endtime, starttime)', ()))
# examine the results
print res.values_list('duration', 'starttime', 'endtime')