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

767voto

Carson Myers Punkte 35660

Es sieht so aus datetime.now() wird ausgewertet, wenn das Modell definiert wird, und nicht jedes Mal, wenn Sie einen Datensatz hinzufügen.

Django hat bereits eine Funktion, um das zu erreichen, was Sie zu tun versuchen:

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

または

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

Der Unterschied zwischen dem zweiten Beispiel und Ihrem jetzigen ist das Fehlen von Klammern. Durch die Übergabe von datetime.now ohne die Klammern übergeben Sie die eigentliche Funktion, die jedes Mal aufgerufen wird, wenn ein Datensatz hinzugefügt wird. Wenn Sie sie übergeben datetime.now() dann werten Sie nur die Funktion aus und übergeben ihr den Rückgabewert.

Weitere Informationen finden Sie auf Djangos Modellfeldbezug

200voto

andilabs Punkte 20478

を使うのではなく datetime.now sollten Sie wirklich verwenden from django.utils.timezone import now

Referenz:

Also entscheiden Sie sich für etwas wie das hier:

from django.utils.timezone import now

created_date = models.DateTimeField(default=now, editable=False)

34voto

mykhal Punkte 18078

Von der Dokumentation für das Standardfeld des Django-Modells:

Der Standardwert für das Feld. Dies kann ein Wert oder ein aufrufbares Objekt sein. Wenn es aufrufbar ist, wird es jedes Mal aufgerufen, wenn ein neues Objekt erstellt wird.

Daher sollte Folgendes funktionieren:

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

22voto

MicahT Punkte 373

David hatte die richtige Antwort. Die Klammer () macht es möglich, dass die aufrufbar timezone.now() wird jedes Mal aufgerufen, wenn das Modell ausgewertet wird. Wenn Sie das () aus timezone.now() (oder datetime.now(), wenn Sie das naive datetime-Objekt verwenden) entfernen, wird daraus nur dies:

default=timezone.now

Dann wird es so funktionieren, wie Sie es erwarten:
Neue Objekte erhalten das aktuelle Datum, wenn sie erstellt werden, aber das Datum wird nicht jedes Mal überschrieben, wenn Sie manage.py makemigrations/migrate ausführen.

Ich bin gerade auf das hier gestoßen. Vielen Dank an David.

13voto

Bartosz Punkte 5785

En datetime.now() wird ausgewertet, wenn die Klasse erstellt wird, nicht wenn ein neuer Datensatz zur Datenbank hinzugefügt wird.

Um das zu erreichen, was Sie wollen, definieren Sie dieses Feld als:

date = models.DateTimeField(auto_now_add=True)

Auf diese Weise wird die date wird für jeden neuen Datensatz auf das aktuelle Datum gesetzt.

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