Django选择查询时间差异



我正在尝试在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')

相关内容

  • 没有找到相关文章

最新更新