385 votes

Django. default = problème datetime.now ()

J'ai un tel modèle de base de données:

 from datetime import datetime    

class TermPayment(models.Model):
    dev_session = models.ForeignKey(DeviceSession, related_name='payments')
    user_session = models.ForeignKey(UserSession, related_name='payment')
    date = models.DateTimeField(default=datetime.now(),blank=True)
    sum = models.FloatField(default=0)
    cnt = models.IntegerField(default=0)

    class Meta:
        db_table = 'term_payments'
        ordering = ['-date']
 

et ici une nouvelle instance est ajoutée:

 # ...
tp = TermPayment()
tp.dev_session = self.conn.session # device session hash
tp.user_session = self.session # user session hash
tp.sum = sum
tp.cnt = cnt 
tp.save()
 

Mais j'ai un problème: tous les enregistrements de la base de données ont la même valeur dans le champ date - la date du premier paiement. Après le redémarrage du serveur - un enregistrement a une nouvelle date et d'autres ont le même que le premier. On dirait qu'un cache de données est utilisé mais je ne trouve pas où.

base de données: mysql 5.1.25

Django v1.1.1

765voto

Carson Myers Points 11135

il ressemble datetime.now() est évaluée lorsque le modèle est défini, et pas à chaque fois que vous ajoutez un enregistrement.

Django a une fonction pour accomplir ce que vous essayez de faire déjà:

date = models.DateTimeField(auto_now_add=True, blank=True)

ou

date = models.DateTimeField(default=datetime.now, blank=True)

La différence entre le deuxième exemple et ce que vous avez actuellement est le manque de parenthèses. En passant datetime.now sans les parenthèses, vous passez à la fonction elle-même, qui sera appelée à chaque fois qu'un enregistrement est ajouté. Si vous passer datetime.now(), vous êtes juste à l'évaluation de la fonction et en passant la valeur de retour.

Plus d'informations sont disponibles à Django du modèle de référence de champ

34voto

mykhal Points 5873

De la documentation sur le champ par défaut du modèle django:

La valeur par défaut pour le champ. Cela peut être une valeur ou un objet appelable. S'il est appelable, il sera appelé à chaque fois qu'un nouvel objet est créé.

Par conséquent, la suite devrait fonctionner:

 date = models.DateTimeField(default=datetime.now,blank=True)
 

13voto

Bartosz Points 2183

Le datetime.now() est évalué lors de la création de la classe et non lors de l'ajout d'un nouvel enregistrement à la base de données.

Pour atteindre ce que vous voulez définir ce champ comme:

 date = models.DateTimeField(auto_now_add=True)
 

De cette façon, le champ date sera défini sur la date du jour pour chaque nouvel enregistrement.

9voto

David Points 96

datetime.now () est en cours d'évaluation une fois que votre classe est instanciée. Essayez de supprimer la parenthèse afin que la fonction datetime.now soit renvoyée et ALORS évaluée. J'ai eu le même problème avec la définition des valeurs par défaut pour mes DateTimeFields et j'ai écrit ma solution ici .

7voto

Andrew Harris Points 35

La réponse à cette question est en fait mal.

Remplissage automatique de la valeur (auto_now/auto_now_add, ce n'est pas par défaut). La valeur par défaut sera réellement ce que l'utilisateur voit si sa marque nouvel objet. Ce que j'en général, c'est:

date = models.DateTimeField(default=datetime.now, editable=False,)

Assurez-vous, si vous essayez de représenter ce dans un Admin de la page, qui vous liste comme "read_only' de référence et le nom du champ

read_only = 'date'

Encore une fois, je le fais depuis ma valeur par défaut n'est généralement pas modifiable, et les pages d'administration ignorer non-editables, sauf indication contraire. Il y a certainement une différence cependant entre la création d'une valeur par défaut et la mise en œuvre de la auto_add qui est la clé ici. Faites le Test!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X