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 тоже.

  • DELIMITER / Создание триггера в SQLAlchemy
  • Как форматировать предложение SQL IN с помощью Python
  • Курсор podon pyodbc против курсора базы данных
  • mysql / connector python query работает в mysql, но не python
  • База данных для баскетбольных команд / игр / оценок за сезон. Структура таблицы
  • Как обновить mysql с помощью python, где поля и записи взяты из словаря?
  • кортеж кортежей dict из базы данных mysql
  • Создание таблиц ошибок Django MySQL
  •  
    Interesting Posts for Van-Lav

    Использование другой схемы для той же декларативной базы в sqlalchemy

    Связывание GSL (или другой библиотеки) статически в общей библиотеке

    Как читать числа из файла в Python?

    Преобразование объекта StringIO в Django ImageFile

    Некоторые материалы NLP, связанные с грамматикой, помечением, вытеснением и смысловым смысловым смыслом в Python

    Что может вызвать ошибку Django, когда debug = False, которого нет там, где debug = True

    Pandas DataFrame: заменить все значения в столбце, основываясь на условии

    python optparse, как включить дополнительную информацию в использование?

    Каковы различные варианты взаимодействия C (или C ++) с Python?

    pandas.to_datetime ОШИБКА

    Прочитайте аргументы носа в файле, особенно @attr

    Загрузите данные json для первого запроса и отобразите их на главной странице

    Подсказка типа Python: как рассказать X является подклассом для Foo?

    Возврат из canvas.get_group () вызова в kivy

    При импорте docx в python3.3 у меня есть ошибка ImportError: Нет модуля с именем 'exceptions'

    Python - лучший язык программирования в мире.