Различия Datetime в Django с использованием SQLite

Я создаю приложение Django, которое должно выполнять различия даты. Учитывая модель с DateField и DateField , обе DateField s, в Postgres, это работает как команда, например:

 model.objects.annotate(difference=F(end_date)-F(start_date)) 

будет работать отлично. Однако на бэкэнд SQLite это не работает.

Вместо того, чтобы давать timedelta (или подобное), он возвращает строку, которая примерно равна разнице в годах. Однако SQLite имеет команду julianday() которая преобразует дату в «юлианский день», который можно хотя бы использовать, чтобы получить разницу в днях.

Например, на dbshell это даст правильное количество дней разницы:

 SELECT julianday(end_date) - julianday(start_date) FROM 'appname'.'model'; 

Есть ли способ, которым я могу:

  1. Проверьте бэкэнд базы данных – например. SQLite или нет?

  2. и, если это SQLite, заверните его в функцию julianday ?

One Solution collect form web for “Различия Datetime в Django с использованием SQLite”

Я действительно обошел это, создав пользовательскую функцию базы данных, которая только что делает на SQLite, как показано ниже:

 from django.db.models.expressions import Func # SQLite function to force a date time subtraction to come out correctly. # This just returns the expression on every other database backend. class ForceDate(Func): function = '' template = "%(expressions)s" def __init__(self, expression, **extra): self.__expression = expression super(ForceDate, self).__init__(expression, **extra) def as_sqlite(self, compiler, connection): self.function = 'julianday' self.template = 'coalesce(%(function)s(%(expressions)s),julianday())*24*60*60*1000*1000' # Convert julian day to microseconds as used by Django DurationField return super(ForceDate, self).as_sql(compiler, connection) 

Затем, используя ExpressionWrapper в коде, чтобы принудить разницу в DurationField (обратите внимание, что это работает только в Django 1.8)

 ExpressionWrapper(db.ForceDate(F(a))-db.ForceDate(F(b)), output_field=DurationField()) 
  • Вложенные транзакции с SQLAlchemy и sqlite
  • Неверный порядок сортировки по SQL-алхимии
  • Подстановка Python SQLite с помощью подстановочных знаков в LIKE
  • Зачем закрывать курсор для Sqlite3 в Python
  • Основной пример pySQLite?
  • Python и SQLite: проверьте, существует ли элемент в базе данных?
  • Как получить имя таблицы для выполненного запроса? (python / sqlite)
  • OperationalError, создающий индекс в sqlite
  • Python - лучший язык программирования в мире.