9
votes

Django Orm, insérer Aucun DateTime comme 0 dans MySQL

J'ai une base de données MySQL utilisée par une autre application en plus de Django. Cette application utilise '0000-00-00 00:00:00' code> comme valeur par défaut pour les denttimes.

django (v1.5.5) interprète '0000-00-00 00:00 : 00 ' code> DateTime comme Aucun code> Lorsque vous lisez la base de données et Aucun code> comme null code> lorsque vous écrivez dans la base de données. Cela provoque une erreur car la base de données définit le champ comme non null code>. p>

Réglage manuellement: P>

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


0 commentaires

3 Réponses :


0
votes

Que se passe-t-il lorsque vous ajoutez défaut paramètre sur le champ DateTime ?

my_date = champs.dateTimefield (par défaut = 0)

Je pense que si MySQL l'accepte, Django devrait aussi.


1 commentaires

défaut n'a pas affecté le comportement.



2
votes

Créer une personnalisation DateTimefield code> et remplacer le get_db_prep_value code>. La méthode est copypée de la source Django et une affaire est ajoutée pour la manutention Aucun code>. La valeur doit être convertie de manière spécifique à la base de données, ce qui est un peu hacky, mais cela fonctionne aussi longtemps que la base de données accepte 0000-00-00 00:00:00 code> comme 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)


3 commentaires

Avez-vous un échantillon du code Python où vous utilisez cette méthode? Quel type d'objet est le paramètre de connexion?


@Jonathanvance Je n'utilise jamais directement cette méthode, mais il remplit le comportement par défaut de Django. Connection.OPS.Value_To_DB_DateTime (Aucun) retournerait 'null' mais je voulais '0000-00-00 00:00:00' . J'utilise cette classe comme champ sur un modèle juste comme modèles.dateTimefield est normalement utilisé.


Merci beaucoup, Seppo, cette réponse a vraiment aidé! Consultez ma réponse pour une variante de cela qui fonctionne à Django 1.9 et pourrait être plus épreuve future.



3
votes

bâtiment de la solution de Seppo (qui n'a pas fonctionné pour Django 1.9.4 en raison de manque de connexion.ops.ops.value_to_db_datetime), j'ai fini par utiliser Custom DateTimefield comme suit:

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)


0 commentaires