2010-04-11 20 views
0

je reçois un modèle d'objet, modifier un attribut, enregistrez-le et il a encore l'ancien attribut:économie objet modèle django jette pas d'erreur, mais la valeur d'attribut ne change pas

>>> g = SiteProfile.objects.get(pk=3) 
>>> g.renew_date 
datetime.date(2010, 4, 11) 
>>> g.renew_date = date.today()+timedelta(days=365) 
>>> g.renew_date 
datetime.date(2011, 4, 11) 
>>> g.save() 
>>> g.renew_date 
datetime.datetime(2010, 4, 11, 16, 57, 4, 192684) 

Quelqu'un sait si cela est un problème avec la base de données ou autre chose?

+0

modèle publier –

Répondre

2

Je l'ai compris.

La question était que le champ renew_date avait l'argument auto_now ensemble à True en tant que tel:

renew_date = models.DateField(auto_now=True, editable=False) 

Je compris auto_now signifie que la date actuelle sera utilisée lors de la création de l'objet, mais il se avère que ce pas le cas:

DateField.auto_now

automatiquement mis le champ à maintenant chaque fois que l'objet est enregistré. Utile pour les timestamps "last-modified" . Notez que la date actuelle est toujours utilisée; ce n'est pas seulement une valeur par défaut que vous pouvez remplacer.

De django docs.

Ce que je avais besoin était auto_now_add qui:

Définis automatiquement le champ maintenant lorsque l'objet est créé. Utile pour la création d'horodatages. Notez que la date actuelle est toujours utilisée; ce n'est pas seulement une valeur par défaut que vous pouvez remplacer.

Ainsi, après avoir changé mon champ renew_date:

renew_date = models.DateField(auto_now_add=True, editable=False) 

tout cela fonctionne, très bien :)

>>> g = SelectStatProfile.objects.get(pk=3) 
>>> g.renew_date 
datetime.date(2010, 4, 11) 
>>> from datetime import date, timedelta 
>>> g.renew_date = date.today()+timedelta(days=365) 
>>> g.renew_date 
datetime.date(2011, 4, 11) 
>>> g.save() 
>>> g.renew_date 
datetime.date(2011, 4, 11) 
0

Veuillez vérifier le document django pour la validation automatique. Je suppose que vous devez activer le commit automatique pour accepter le changement immédiatement.

0

Peut-être que vous avez défini DISABLE_TRANSACTION_MANAGEMENT à False:

Comme le dit Django:

Si vous faites cela, Django ne fournira aucune que ce soit la gestion automatique des transactions. Le middleware n'impliquera plus implicitement les transactions, et vous devrez vous-même gérer la gestion. Cela vous oblige même à valider les modifications effectuées par un middleware ailleurs.