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?
Odpowiedzi:
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):
....
created
i updated
. 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
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ć.
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
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.