Есть ли в моделях django поле временной метки по умолчанию?


91

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

Ответы:


178

По умолчанию такого нет, но добавить его очень просто. Просто используйте 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)

33

Автоматически не похоже на то, что 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):
    ....

2
Существует также model_utilsдля Django, который уже содержит TimeStampedModel, но если вам больше ничего не нужно из этого пакета, просто сохраните его без лишнего веса.
boldnik

@boldnik Я фанат простоты.
Yuji 'Tomita' Tomita

Довольно круто ... У меня есть 3 класса, которым нужна метка времени для createdи updated. Это отличный способ сделать это чисто.
ron_g


5

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

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

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

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


2

Если вы хотите иметь возможность изменять это поле, установите следующее вместо 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

Я думаю, что пойду с

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.