Django选择查询时间差异

时间:2011-04-18 04:22:44

标签: django django-models django-queryset

我正在尝试使用以下列查询django中的数据库表:

id | start_time | end_time

我可以直接在查询中获得差异,而不是获取两者的单独值吗? 有这样的效果:

SELECT id, Diff(start_time, end_time) FROM myTable

4 个答案:

答案 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')