J'ai une base de données MySQL utilisée par une autre application en plus de Django. Cette application utilise django (v1.5.5) interprète Réglage manuellement: P> '0000-00-00 00:00:00' code> comme valeur par défaut pour les denttimes. '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> model.datetime = '0000-00-00 00:00:00'
3 Réponses :
Que se passe-t-il lorsque vous ajoutez défaut code> paramètre sur le champ DateTime ? P>
Je pense que si MySQL l'accepte, Django devrait aussi. P>
my_date = champs.dateTimefield (par défaut = 0)
code> p>
défaut code> n'a pas affecté le comportement.
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)
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) code> retournerait 'null' code> mais je voulais '0000-00-00 00:00:00' code>. J'utilise cette classe comme champ sur un modèle juste comme modèles.dateTimefield code> 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.
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)