Haben Modelle in Django ein Standard-Zeitstempelfeld?


88

Gibt es in Django ein Standard-Zeitstempelfeld für alle Objekte? Muss ich in meinem Modell explizit ein Feld "Zeitstempel" für "Erstellt am" deklarieren - oder gibt es eine Möglichkeit, dies automatisch zu ermitteln?

Antworten:


166

Standardmäßig gibt es so etwas nicht, aber das Hinzufügen eines ist super einfach. Verwenden Sie einfach den auto_now_addParameter in der DateTimeFieldKlasse:

created = models.DateTimeField(auto_now_add=True)

Sie können es auch auto_nowfür ein Feld "Aktualisiert am" verwenden. Überprüfen Sie das Verhalten von auto_now hier .

Für auto_now_add hier .

Ein Modell mit beiden Feldern sieht folgendermaßen aus:

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

32

Automatisch klingt es nicht so, als würde Django standardmäßig etwas tun. Es würde Sie nicht zwingen, einen Zeitstempel zu benötigen.

Ich würde eine abstrakte Basisklasse erstellen und alle Modelle davon erben, wenn Sie den Zeitstempel / Feldnamen usw. nicht vergessen möchten.

class TimeStampedModel(models.Model):
     created_on = models.DateTimeField(auto_now_add=True)

     class Meta:
         abstract = True

Es scheint nicht viel zu importieren wherever.TimeStampedModelstattdjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2
Es gibt auch model_utilsfür Django, das bereits enthält TimeStampedModel, aber wenn Sie nichts anderes von diesem Paket benötigen, behalten Sie es einfach ohne zusätzliches Gewicht.
Boldnik

@boldnik Ich bin ein Fan von Einfachheit.
Yuji 'Tomita' Tomita

Ziemlich cool ... Ich habe 3 Klassen, die einen Zeitstempel für createdund brauchten updated. Dies ist eine großartige Möglichkeit, es sauber zu machen.
Donrondadon


5

Sie können Django-Erweiterungen ausprobieren

Wenn Sie ein abstraktes Zeitstempelmodell verwenden möchten

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Es hat andere abstrakte Modelle. das kannst du auch benutzen.


2

Wenn Sie dieses Feld ändern möchten, legen Sie statt Folgendes fest auto_now_add=True:

Für Datum

from datetime import date

models.DateField(default=date.today)

Für DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)

0

Ich denke, ich würde mitgehen

created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

Ich brauche einige Klarstellungen zur Verwendung

class TimeStampedModel(models.Model):
    created_on = models.DateTimeField(auto_now_add=True)

    class Meta:
         abstract = True
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.