Mysql
 sql >> Base de données >  >> RDS >> Mysql

Django ORM, n'insérez aucun datetime comme 0 dans MySQL

en m'appuyant sur la solution de Seppo (qui ne fonctionnait pas pour django 1.9.4 en raison de l'absence de connection.ops.value_to_db_datetime), j'ai fini par utiliser un DateTimeField personnalisé comme suit :

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

Ensuite, utilisez simplement ZeroDateTimeField dans vos modèles au lieu de DateTimeField.

fonctionne comme un charme et j'ai dû dire au client de réparer sa base de données mysql;-)

EDIT :j'ai fini par remplacer le constructeur pour définir null=True et blank=True pour faciliter l'utilisation des modèles générés automatiquement. Comme cela peut être utile pour certains, le voici (c'est facultatif et discutable) :

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)