Trong django các mô hình có trường dấu thời gian mặc định không?


90

Trong django - có trường dấu thời gian mặc định cho tất cả các đối tượng không? Đó là, tôi có phải khai báo rõ ràng trường 'dấu thời gian' cho 'được tạo trên' trong Mô hình của tôi - hay có cách nào để lấy trường này một cách tự động?

Câu trả lời:


175

Theo mặc định, không có thứ nào như vậy, nhưng việc thêm một cái thì rất dễ dàng. Chỉ cần sử dụng auto_now_addtham số trong DateTimeFieldlớp:

created = models.DateTimeField(auto_now_add=True)

Bạn cũng có thể sử dụng auto_nowcho trường 'cập nhật trên'. Kiểm tra hành vi của auto_now ở đây .

Đối với auto_now_add đây .

Một mô hình có cả hai trường sẽ giống như sau:

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

32

Tự động nghe không giống như một cái gì đó django sẽ làm theo mặc định. Nó sẽ không bắt bạn phải yêu cầu dấu thời gian.

Tôi sẽ xây dựng một lớp cơ sở trừu tượng và kế thừa tất cả các mô hình từ nó nếu bạn không muốn quên về nhãn thời gian / tên trường, v.v.

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

     class Meta:
         abstract = True

Có vẻ như không nhiều để nhập wherever.TimeStampedModelthay vìdjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2
Ngoài ra còn có model_utilscho Django đã chứa sẵn TimeStampedModel, nhưng nếu bạn không cần bất kỳ thứ gì khác từ gói này, chỉ cần giữ nó thêm trọng lượng.
boldnik

@boldnik Tôi là người yêu thích sự đơn giản.
Yuji 'Tomita' Tomita

Khá tuyệt ... Tôi có 3 lớp cần dấu thời gian cho createdupdated. Đây là một cách tuyệt vời để làm điều đó một cách sạch sẽ.
ron_g


5

Bạn có thể thử django-extensions

nếu bạn muốn sử dụng mô hình trừu tượng dấu thời gian

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Nó có các mô hình trừu tượng khác. bạn cũng có thể sử dụng nó.


2

Nếu bạn muốn có thể sửa đổi trường này, hãy đặt như sau thay vì auto_now_add=True:

Cho ngày

from datetime import date

models.DateField(default=date.today)

Đối với DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)

0

Tôi nghĩ tôi sẽ đi cùng

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

Tôi cần một số giải thích rõ về việc sử dụng

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

    class Meta:
         abstract = True
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.