В django у моделей есть поле отметки времени по умолчанию? - PullRequest
74 голосов
/ 05 ноября 2011

В django - есть ли поле отметки времени по умолчанию для всех объектов? То есть я должен явно объявить поле «метка времени» для «создан на» в моей модели - или есть способ получить это автоматически?

Ответы [ 6 ]

130 голосов
/ 05 ноября 2011

По умолчанию такого нет, но добавить его очень просто.Просто используйте параметр auto_now_add в классе DateTimeField:

created = models.DateTimeField(auto_now_add=True)

Вы также можете использовать auto_now для поля «обновление включено».Проверьте поведение auto_now здесь .

Для auto_now_add здесь .

Модель с обоими полями будет выглядеть следующим образом:

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
28 голосов
/ 05 ноября 2011

Автоматически не похоже на то, что django сделал бы по умолчанию. Это не заставит вас требовать отметку времени.

Я бы создал абстрактный базовый класс и унаследовал бы от него все модели, если вы не хотите забывать о отметке времени / имени поля и т. Д.

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

     class Meta:
         abstract = True

Не так уж много импортировать wherever.TimeStampedModel вместо django.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....
13 голосов
/ 05 ноября 2011

Если вы используете django-extensions (это хорошее приложение для добавления функциональности в помощник командной строки django-admin.py), вы можете получить эти поля модели бесплатно, унаследовав от их TimeStampedModel или использование их пользовательских полей TimeStamp

4 голосов
/ 11 февраля 2016

Вы можете попробовать django-extensions

, если хотите использовать абстрактную модель с отметкой времени

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

В ней есть другие абстрактные модели.Вы можете использовать это тоже.

1 голос
/ 15 августа 2018

Если вы хотите изменить это поле, установите вместо auto_now_add=True:

Дата

from datetime import date

models.DateField(default=date.today)

Для DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)
0 голосов
/ 22 июля 2018

Я думаю, я бы пошел с

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

Мне нужны пояснения по использованию

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

    class Meta:
         abstract = True
...