// Cập nhật
Các comment dưới các bài bản gốc đã cho tôi suy nghĩ. Tôi đoán đây là giải pháp tốt nhất cho đến nay:
from datetime import datetime, timedelta
class MyModel(models.Model):
mydate = models.DateTimeField(default=datetime.now()+timedelta(days=30))
// 2. Cập nhật
Nếu bạn muốn xác định một thuộc tính mô hình mà vẫn giữ lượng ngày mà nên được bổ sung bạn sẽ cần ghi đè phương thức lưu. Cho đến nay tôi không thể nghĩ ra một cách đơn giản hơn.
Giải pháp:
class MyModel(models.Model):
mydate = models.DateTimeField(editable=False)
daysadded = models.IntegerField()
def save(self):
from datetime import datetime, timedelta
d = timedelta(days=self.daysadded)
if not self.id:
self.mydate = datetime.now() + d
super(MyModel, self).save()
Như becomingGuru đã đề nghị bạn nên ghi đè lên mô hình của bạn phương pháp tiết kiệm.
Ví dụ:
class MyModel(models.Model):
mydate = models.DateTimeField(auto_now_add=True)
def save(self):
from datetime import timedelta
d = timedelta(days=30)
// only add 30 days if it's the first time the model is saved
if not self.id:
// not saving the model before adding the timedelta gave me errors
super(MyModel, self).save()
self.mydate += d
// final save
super(MyModel, self).save()
Đây không phải là cách tốt nhất đối với tôi kể từ khi bạn có để lưu các mô hình hai lần. Nhưng việc sử dụng auto_now_add yêu cầu bạn phải lưu mô hình trước tiên trước khi một cá thể datetime cho mydate được tạo.
Một cách tiếp cận đó sẽ yêu cầu tiết kiệm chỉ có một:
class MyModel(models.Model):
mydate = models.DateTimeField(editable=False) // editable=False to hide in admin
def save(self):
from datetime import datetime, timedelta
d = timedelta(days=30)
// only add 30 days if it's the first time the model is saved
if not self.id:
self.mydate = datetime.now() + d
super(MyModel, self).save()
Hy vọng rằng sẽ giúp!
Đây là một đoán, nhưng Django Các hình thức cho phép chức năng cuộc gọi trong 'ban đầu =' giá trị của họ. Nếu đây là trường hợp cũng cho các mô hình, sau đó bạn có thể loại bỏ auto_add_now và thay thế nó bằng 'default = lambda: datetime.now() + timedelta (days = 30)' –