386 Stimmen

Django datetime Probleme (Standard=datetime.now())

Ich habe das unten stehende db-Modell:

from datetime import datetime    

class TermPayment(models.Model):
    # I have excluded fields that are irrelevant to the question
    date = models.DateTimeField(default=datetime.now(), blank=True)

Ich füge eine neue Instanz hinzu, indem ich den folgenden Befehl verwende:

tp = TermPayment.objects.create(**kwargs)

Mein Problem: Alle Datensätze in der Datenbank haben den gleichen Wert im Datumsfeld, nämlich das Datum der ersten Zahlung. Nach dem Neustart des Servers hat ein Datensatz das neue Datum und die anderen Datensätze haben das gleiche Datum wie der erste. Es sieht so aus, als ob einige Daten zwischengespeichert werden, aber ich kann nicht herausfinden, wo.

Datenbank: mysql 5.1.25

django v1.1.1

9voto

David Punkte 217

datetime.now() wird einmal ausgewertet, wenn Ihre Klasse instanziiert wird. Versuchen Sie, die Klammern zu entfernen, damit die Funktion datetime.now zurückgegeben und DANN ausgewertet. Ich hatte das gleiche Problem mit der Einstellung von Standardwerten für meine DateTimeField s und schrieb meine Lösung auf hier .

7voto

ars Punkte 112843

In der Python-Sprachreferenz finden Sie unter Funktionsdefinitionen :

Standardparameterwerte werden bei der Ausführung der Funktionsdefinition ausgewertet. Das bedeutet, dass der Ausdruck einmal ausgewertet wird, wenn die Funktion definiert wird, und dass derselbe "vorberechnete" Wert für jeden Aufruf verwendet wird.

Glücklicherweise hat Django eine Möglichkeit, das zu tun, was Sie wollen, wenn Sie die auto_now Argument für die DateTimeField :

date = models.DateTimeField(auto_now=True)

Siehe die Django-Dokumente für DateTimeField .

7voto

Andrew Harris Punkte 1595

Die Antwort auf diese Frage ist eigentlich falsch.

Automatisches Ausfüllen des Wertes (auto_now/auto_now_add ist nicht dasselbe wie default). Der Standardwert wird tatsächlich das sein, was der Benutzer sieht, wenn es ein brandneues Objekt ist. Was ich in der Regel tun ist:

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

Vergewissern Sie sich, wenn Sie versuchen, dies in einer Admin-Seite darzustellen, dass Sie es als "read_only" auflisten und auf den Feldnamen verweisen

read_only = 'date'

Ich tue dies, da mein Standardwert in der Regel nicht bearbeitbar ist und Admin-Seiten nicht bearbeitbare Werte ignorieren, sofern nicht anders angegeben. Es gibt jedoch einen Unterschied zwischen dem Festlegen eines Standardwerts und der Implementierung von auto_add, was hier der Schlüssel ist. Probieren Sie es aus!

3voto

Bosco Oludhe Punkte 1

In Django 3.0 auto_now_add scheint zu funktionieren mit auto_now

reg_date=models.DateField(auto_now=True,blank=True)

3voto

Manoj Parmar Punkte 11

Wenn Sie nur DateField benötigen, versuchen Sie dies

date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)

Wenn Sie sowohl Datum als auch Uhrzeit benötigen, versuchen Sie dies

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X