У django моделі мають поле часу за замовчуванням?


90

У django - чи є поле мітки часу за замовчуванням для всіх об’єктів? Тобто, чи потрібно явно оголошувати поле "мітки часу" для "створено" у моїй Моделі - чи є спосіб отримати це автоматично?

Відповіді:


175

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

32

Автоматично це не схоже на те, що за замовчуванням робив би 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

13

Якщо ви використовуєте розширення django (що є хорошим додатком для додавання функціональності до помічника командного рядка django-admin.py), ви можете отримати ці поля моделі безкоштовно, успадкувавши їх від TimeStampedModel або використовуючи власні поля TimeStamp


5

Ви можете спробувати розширення django

якщо ви хочете використовувати абстрактну модель із позначкою часу

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.