34

タイトルが示すように。DateFieldフィールドに 30 日を追加したい。これは、レコードの作成時に自動入力されますauto_now_add=True

これを行う方法はありますか?

ありがとう

4

5 に答える 5

67

カスタム保存メソッドを実装する必要はありません。

また、これを行うこと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)
于 2013-03-08T08:15:10.150 に答える
59

// アップデート

元の投稿の下のコメントで考えさせられました。私はこれがこれまでのところ最良の解決策だと思います:

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()

それが役に立ったことを願っています!

于 2010-02-04T11:52:49.187 に答える
5

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()にも記載されています。

于 2010-02-04T11:00:31.337 に答える
1

モデルの保存をオーバーライドし、保存中に 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)
于 2010-02-04T11:01:52.467 に答える