Django选择查询时间差

| 我正在尝试在django中查询数据库表,其中包括以下各列:
id | start_time | end_time
我可以直接在查询中获得差值,而不是获取两者的单独值? 达到此效果的方法:
SELECT id, Diff(start_time, end_time) FROM myTable
    
已邀请:
QuerySet.extra()
允许您为列指定任意表达式。请注意,结果将取决于DB。     
这可以完全通过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()))
    
在我看来,最简单的方法是添加带有差异的第三列,并在每次修改对象时更新它,如下所示:
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开始,建议不要使用
annotate
+
RawSQL
extra
。以下适用于MySQL:
res = MyTable.objects.annotate(duration=RawSQL(\'datediff(endtime, starttime)\', ()))
# examine the results
print res.values_list(\'duration\', \'starttime\', \'endtime\')
    

要回复问题请先登录注册