Django ORM, Вставить Нет datetime как 0 в MySQL

У меня есть база данных MySQL, которая используется другим приложением помимо Django. Это приложение использует '0000-00-00 00:00:00' как значение по умолчанию для datetimes.

Django (v1.5.5) интерпретирует '0000-00-00 00:00:00' datetime как None при чтении базы данных и None как NULL при записи в базу данных. Это вызывает ошибку, так как база данных определяет это поле как NOT NULL .

Ручная настройка:

 model.datetime = '0000-00-00 00:00:00' 

Не работает, потому что Django считает, что это недопустимая дата.

Как создать пользовательское поле datetime, которое вставляет None как '0000-00-00 00:00:00' ?

3 Solutions collect form web for “Django ORM, Вставить Нет datetime как 0 в MySQL”

Создайте пользовательский DateTimeField и переопределите get_db_prep_value . Этот метод копируется из источника django, и для обработки None добавляется случай. Значение должно быть преобразовано в базу данных определенным образом, так что это немного взломанно, но оно работает до тех пор, пока база данных принимает 0000-00-00 00:00:00 как дату и время.

 from django.db import models class ZeroDateTimeField(models.DateTimeField): def get_db_prep_value(self, value, connection, prepared=False): # Casts datetimes into the format expected by the backend if not prepared: value = self.get_prep_value(value) # Use zeroed datetime instead of NULL if value is None: return "0000-00-00 00:00:00" else: return connection.ops.value_to_db_datetime(value) 

EDIT: этот ответ был написан для Django 1.5, и поддержка с другими версиями не была протестирована.

основанный на решении Seppo (который не работал для django 1.9.4 из-за отсутствия connection.ops.value_to_db_datetime), я закончил использование пользовательского DateTimeField следующим образом:

 from django.db import models class ZeroDateTimeField(models.DateTimeField): def get_db_prep_value(self, value, connection, prepared=False): value = super( ZeroDateTimeField, self ).get_db_prep_value( value, connection, prepared ) if value is None: return "0000-00-00 00:00:00" return value 

Затем просто используйте ZeroDateTimeField в своих моделях вместо DateTimeField.

работает как шарм, и я общался с тем, чтобы сказать клиенту исправить его mysql db 😉

EDIT: я закончил переопределять конструктор, чтобы установить null = True и blank = True, чтобы облегчить использование автоматически сгенерированных моделей. Поскольку это может быть полезно для некоторых, вот оно (это необязательно и сомнительно):

 def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs): kwargs['null'] = True kwargs['blank'] = True super( ZeroDateTimeField, self ).__init__(verbose_name, name, auto_now, auto_now_add, **kwargs) 

Что происходит, когда вы добавляете параметр по default в поле datetime ?

my_date = fields.DateTimeField(default=0)

Я думаю, что если MySQL примет это, Django тоже.

  • InterfaceError (0, '')
  • хранение внешнего ключа, а не из метода POST формы, но по формам данных у меня уже есть
  • Как написать эффективный счетчик посещений для сайтов
  • Как скопировать базу данных с mysqldump и mysql в Python?
  • Запрос Django в отношениях от одного до большого
  • Почему MYSQL DB возвращает поврежденное значение при усреднении по Django models.DateTimeField?
  • Лучший способ повторить все строки в таблице DB
  • SQLAlchemy и UnicodeDecodeError
  • ImportError: нет модуля с именем mysql.base, в проекте django на сервере Ubuntu 11.04
  • SQLAlchemy и соединения, у нас нет внешних ключей
  • Django views.py. Версия SQL. Присоединение к Multi Table Query
  • Python - лучший язык программирования в мире.