Django Select Dery Time Diff - PullRequest
       17

Django Select Dery Time Diff

2 голосов
/ 18 апреля 2011

Я пытаюсь запросить таблицу базы данных в django, среди прочего, со следующими столбцами:

id | start_time | end_time

Вместо того, чтобы получать отдельные значения для двух, я могу просто получить разницу непосредственно в запросе? Что-то на этот счет:

SELECT id, Diff(start_time, end_time) FROM myTable

Ответы [ 4 ]

4 голосов
/ 30 августа 2016

Это можно сделать полностью через ORM в Django 1.10 и выше.С такой моделью:

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()))
2 голосов
/ 18 апреля 2011

QuerySet.extra() позволит вам указать произвольные выражения для столбца. Обратите внимание, что результат будет зависеть от БД.

1 голос
/ 18 апреля 2011

Мне кажется, что проще всего добавить третий столбец с разницей и обновлять его каждый раз, когда объект изменяется следующим образом:

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')
0 голосов
/ 03 ноября 2015

Начиная с Django 1.8, extra не рекомендуется в пользу annotate + RawSQL.Следующие работы для MySQL:

res = MyTable.objects.annotate(duration=RawSQL('datediff(endtime, starttime)', ()))
# examine the results
print res.values_list('duration', 'starttime', 'endtime')
...