Dalam django, apakah model memiliki bidang cap waktu default?

90

Di django - apakah ada bidang cap waktu default untuk semua objek? Yaitu, apakah saya harus secara eksplisit menyatakan bidang 'stempel waktu' untuk 'dibuat pada' di Model saya - atau adakah cara untuk mendapatkannya secara otomatis?

9-bit
sumber

Jawaban:

176

Tidak ada hal seperti itu secara default, tetapi menambahkannya sangatlah mudah. Cukup gunakan auto_now_addparameter di DateTimeFieldkelas:

created = models.DateTimeField(auto_now_add=True)

Anda juga dapat menggunakan auto_nowuntuk bidang 'diperbarui pada'. Periksa perilaku di auto_now sini .

Untuk auto_now_add disini .

Model dengan kedua bidang akan terlihat seperti ini:

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
MoshiBin
sumber
33

Secara otomatis tidak terdengar seperti sesuatu yang Django lakukan secara default. Ini tidak akan memaksa Anda untuk meminta stempel waktu.

Saya akan membangun kelas dasar abstrak dan mewarisi semua model darinya jika Anda tidak ingin melupakan stempel waktu / nama bidang, dll.

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

     class Meta:
         abstract = True

Tampaknya tidak banyak yang harus diimpor wherever.TimeStampedModeldaripadadjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....
Yuji 'Tomita' Tomita
sumber
2
Ada juga model_utilsuntuk Django yang sudah berisi TimeStampedModel, tetapi jika anda tidak memerlukan apapun dari paket ini, simpan saja tanpa bobot ekstra.
boldnik
@boldnik Saya penggemar kesederhanaan.
Yuji 'Tomita' Tomita
Cukup keren ... Saya memiliki 3 kelas yang membutuhkan stempel waktu untuk createddan updated. Ini adalah cara yang bagus untuk melakukannya dengan bersih.
ron_g
5

Anda dapat mencoba django-extensions

jika Anda ingin menggunakan model abstrak cap waktu

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Ini memiliki model abstrak lainnya. Anda bisa menggunakannya juga.

Wagh
sumber
2

Jika Anda ingin dapat mengubah bidang ini, setel yang berikut ini sebagai ganti auto_now_add=True:

Untuk Tanggal

from datetime import date

models.DateField(default=date.today)

Untuk DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)
chaggy
sumber
0

Saya pikir saya akan pergi dengan

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

Saya membutuhkan beberapa klarifikasi tentang penggunaan

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

    class Meta:
         abstract = True
Omodamola Oladeji
sumber