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?
źródło
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?
Domyślnie nie ma czegoś takiego, ale dodanie jednego jest super łatwe. Po prostu użyj auto_now_add
parametru w DateTimeField
klasie:
created = models.DateTimeField(auto_now_add=True)
Możesz również użyć auto_now
dla 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)
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.TimeStampedModel
zamiastdjango.db.models.Model
class MyFutureModels(TimeStampedModel):
....
model_utils
dla Django, które już zawieraTimeStampedModel
, ale jeśli nie potrzebujesz niczego innego z tego pakietu, po prostu zachowaj go bez dodatkowej wagi.created
iupdated
. To świetny sposób, aby zrobić to czysto.Jeśli używasz django-extensions (co jest dobrą aplikacją do dodawania funkcjonalności do pomocnika wiersza poleceń django-admin.py), możesz pobrać te pola modelu za darmo, dziedzicząc z ich TimeStampedModel lub używając ich niestandardowych pól TimeStamp
źródło
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ć.
źródło
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)
źródło
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
źródło