Django ORM, Insert None datetime as 0 into MySQL

django, mysql, python

Solution

Create a custom `DateTimeField` and override the `get_db_prep_value`. The method is copypasted from the django source and a case is added for handling `None`. The value should be converted in a database specific manner so this is a bit hacky but it works as long as the database accepts `0000-00-00 00:00:00` as a datetime.

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: This answer was written for Django 1.5 and support with other versions has not been tested.

Problem

I have a MySQL database that is used by another application besides Django. That application uses `'0000-00-00 00:00:00'` as default value for datetimes. Django (v1.5.5) interprets `'0000-00-00 00:00:00'` datetime as `None` when reading the database and `None` as `NULL` when writing into the database. This causes an error since the database defines the field as `NOT NULL`. Manually setting: ``` model.datetime = '0000-00-00 00:00:00' ``` Doesn't work because Django feels that this is an invalid date. How do I create a custom datetime field which inserts `None` as `'0000-00-00 00:00:00'`?

Original source