Bất kỳ trường nào có bộ auto_now
thuộc tính cũng sẽ kế thừa editable=False
và do đó sẽ không hiển thị trong bảng quản trị. Trước đây đã có những cuộc nói chuyện về việc làm cho các cuộc tranh luận auto_now
và auto_now_add
biến mất, và mặc dù chúng vẫn tồn tại, tôi cảm thấy tốt hơn hết là chỉ sử dụng một phương thức tùy chỉnhsave()
.
Vì vậy, để làm cho điều này hoạt động chính xác, tôi khuyên bạn không nên sử dụng auto_now
hoặc auto_now_add
thay vào đó hãy xác định save()
phương thức của riêng bạn để đảm bảo rằng created
nó chỉ được cập nhật nếu id
không được đặt (chẳng hạn như khi mục này được tạo lần đầu tiên) và hãy cập nhật modified
mỗi khi mục đó được lưu.
Tôi đã thực hiện chính xác điều tương tự với các dự án khác mà tôi đã viết bằng Django, và vì vậy bạn save()
sẽ trông như thế này:
from django.utils import timezone
class User(models.Model):
created = models.DateTimeField(editable=False)
modified = models.DateTimeField()
def save(self, *args, **kwargs):
''' On save, update timestamps '''
if not self.id:
self.created = timezone.now()
self.modified = timezone.now()
return super(User, self).save(*args, **kwargs)
Hi vọng điêu nay co ich!
Chỉnh sửa để phản hồi ý kiến:
Lý do tại sao tôi chỉ gắn bó với quá tải save()
so với dựa vào các đối số trường này là hai lần:
- Những thăng trầm nói trên với độ tin cậy của chúng. Các đối số này phụ thuộc rất nhiều vào cách mỗi loại cơ sở dữ liệu mà Django biết cách tương tác với xử lý trường tem ngày / giờ và dường như phá vỡ và / hoặc thay đổi giữa mỗi lần phát hành. (Điều mà tôi tin là động lực đằng sau lời kêu gọi loại bỏ chúng hoàn toàn).
- Thực tế là chúng chỉ hoạt động trên DateField, DateTimeField và TimeField và bằng cách sử dụng kỹ thuật này, bạn có thể tự động điền bất kỳ loại trường nào mỗi khi một mục được lưu.
- Sử dụng
django.utils.timezone.now()
so với datetime.datetime.now()
, bởi vì nó sẽ trả về một datetime.datetime
đối tượng nhận biết TZ hoặc ngây thơ tùy thuộc vào settings.USE_TZ
.
Để giải quyết lý do tại sao OP thấy lỗi, tôi không biết chính xác, nhưng có vẻ như created
thậm chí không được phổ biến, mặc dù có auto_now_add=True
. Đối với tôi, nó nổi bật như một lỗi và nhấn mạnh mục số 1 trong danh sách nhỏ của tôi ở trên: auto_now
và auto_now_add
không ổn định nhất.