タイトルが示すように。DateField
フィールドに 30 日を追加したい。これは、レコードの作成時に自動入力されますauto_now_add=True
これを行う方法はありますか?
ありがとう
カスタム保存メソッドを実装する必要はありません。
また、これを行うことdefault=datetime.now()+timedelta(days=30)
は絶対に間違っています!django のインスタンスを起動すると評価されます。一部の構成では、apache はすべての要求で django アプリケーションを取り消すため、apache を使用する場合はおそらく機能しますが、それでもいつかコードを調べて、これが期待どおりに計算されない理由を理解しようとすることがあります。
これを行う正しい方法は、呼び出し可能なオブジェクトをデフォルト引数に渡すことです。datetime.today 関数またはカスタム関数にすることができます。その後、新しいデフォルト値をリクエストするたびに評価されます。
def get_deadline():
return datetime.today() + timedelta(days=20)
class Bill(models.Model):
name = models.CharField(max_length=50)
customer = models.ForeignKey(User, related_name='bills')
date = models.DateField(default=datetime.today)
deadline = models.DateField(default=get_deadline)
// アップデート
元の投稿の下のコメントで考えさせられました。私はこれがこれまでのところ最良の解決策だと思います:
from datetime import datetime, timedelta
class MyModel(models.Model):
mydate = models.DateTimeField(default=datetime.now()+timedelta(days=30))
// 2.更新
追加する必要がある日数を保持するモデル属性を定義する場合は、save メソッドをオーバーライドする必要があります。これまでのところ、より簡単な方法を思いつくことができませんでした。
解決:
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()
goingGuru がすでに示唆しているように、モデルの save メソッドをオーバーライドする必要があります。
例:
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()
モデルを 2 回保存する必要があるため、これは私にとって最善の方法ではありません。ただし、auto_now_add を使用するには、mydate の datetime インスタンスを作成する前に、まずモデルを保存する必要があります。
1回の保存のみを必要とする別のアプローチ:
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()
それが役に立ったことを願っています!
Python を使用しますtimedelta
。
from datetime import timedelta
d = timedelta(days=30)
# object is your current instance of the model
object.yourdatefield += d
# or this because I am not sure whether the previous works
object.yourdatefield = object.yourdatefield + d
object.save()
そしてDjangoのドキュメントから:
DateField Python でインスタンス
によって表される日付。datetime.date
オブジェクトの作成に 30 日を追加したい場合は、忘れて、comingGuruauto_now_add=True
が提案するようにしてください。オーバーライドに関する情報は、 Django のドキュメントsave()
にも記載されています。
モデルの保存をオーバーライドし、保存中に pk が設定されているかどうかを確認します。
>>> from datetime import datetime
>>> from datetime import timedelta
>>> cur_date = datetime.now()
>>> cur_date
datetime.datetime(2010, 2, 4, 5, 0, 24, 437405)
>>> cur_date+timedelta(days=30)
datetime.datetime(2010, 3, 6, 5, 0, 24, 437405)