Czy w django modele mają domyślne pole datownika?

90

W django - czy istnieje domyślne pole datownika dla wszystkich obiektów? To znaczy, czy muszę jawnie zadeklarować pole „sygnatura czasowa” dla „utworzonego w” w moim modelu - czy jest sposób, aby uzyskać to automagicznie?

9-bitowy
źródło

Odpowiedzi:

175

Domyślnie nie ma czegoś takiego, ale dodanie jednego jest super łatwe. Po prostu użyj auto_now_addparametru w DateTimeFieldklasie:

created = models.DateTimeField(auto_now_add=True)

Możesz również użyć auto_nowdla pola „zaktualizowano”. Sprawdź zachowanie auto_now tutaj .

Dla auto_now_add tutaj .

Model z obydwoma polami będzie wyglądał następująco:

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
MoshiBin
źródło
32

Automagicznie nie brzmi jak coś, co django zrobiłoby domyślnie. Nie zmusiłoby to do wymagania znacznika czasu.

Zbudowałbym abstrakcyjną klasę bazową i odziedziczyłbym z niej wszystkie modele, jeśli nie chcesz zapomnieć o sygnaturze czasowej / nazwie pola itp.

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

     class Meta:
         abstract = True

Nie wydaje się, żeby dużo importować wherever.TimeStampedModelzamiastdjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....
Yuji „Tomita” Tomita
źródło
2
Jest też model_utilsdla Django, które już zawiera TimeStampedModel, ale jeśli nie potrzebujesz niczego innego z tego pakietu, po prostu zachowaj go bez dodatkowej wagi.
boldnik
@boldnik Jestem fanem prostoty.
Yuji 'Tomita' Tomita
Całkiem fajnie ... Mam 3 zajęcia, które wymagały znacznika czasu dla createdi updated. To świetny sposób, aby zrobić to czysto.
ron_g
5

Możesz wypróbować rozszerzenia django

jeśli chcesz użyć abstrakcyjnego modelu znacznika czasu

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Ma inne abstrakcyjne modele. możesz tego użyć.

Wagh
źródło
2

Jeśli chcesz mieć możliwość modyfikowania tego pola, ustaw następujące zamiast auto_now_add=True:

Na randkę

from datetime import date

models.DateField(default=date.today)

Dla DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)
chaggy
źródło
0

Myślę, że poszedłbym z

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

Potrzebuję wyjaśnień na temat używania

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

    class Meta:
         abstract = True
Omodamola Oladeji
źródło