DjangoDateFieldのデフォルトオプション


82

日時フィールドを持つモデルがあります。

date = models.DateField(_("Date"), default=datetime.now())

組み込みのdjangoadminでアプリをチェックするとDateField、時間も追加されているため、保存しようとするとエラーが返されます。デフォルトを日付だけにするにはどうすればよいですか?(datetime.today()どちらも機能していません)

回答:


150

そのため、モジュール内のクラスではなく、常に基本datetimeモジュールをインポートimport datetimeする必要datetimeがありますfrom datetime import datetime

あなたが犯した他の間違いは、実際にデフォルトで関数を呼び出すことです()。これは、すべてのモデルがクラスが最初に定義されたときに日付を取得することを意味します。したがって、サーバーがApacheを再起動せずに数日または数週間稼働している場合、すべての要素は同じ初期日付を取得します。

したがって、フィールドは次のようになります。

import datetime
date = models.DateField(_("Date"), default=datetime.date.today)

時間デルタを追加してこれを行う方法はありますか?例:default = datetime.date.today + datetime.timedelta(days = 4)...このコードは機能しませんが、それがアイデアです。(確かに、saveメソッドはこれを行うための1つの場所ですが、定義の一部としてこれを行う方法があるかどうか疑問に思っています)
Joe J

1
@Joe J:これは本当に新しい質問になるはずです。ただし、呼び出し可能オブジェクトを使用できるという事実は、today +4を返す独自の関数を定義できることを意味します。
ダニエルローズマン2011

23
何し_("Date")てるの?
benregn 2011

10
@benregnフィールドに「日付」のラベルを付けていますが、国際化システムを使用して翻訳用にマークを付けています。
ダニエルローズマン

それを明確にしてくれてありがとう、私はDjango devを始めたばかりで、それが単なるラベリング以上のことをしているのかどうか私には少し不明確でした。
benregn 2011

38

あなたの間違いは、datetimeモジュールの代わりにモジュールを使用することdateです。あなたはこれをするつもりでした:

from datetime import date
date = models.DateField(_("Date"), default=date.today)

現在の日付のみをキャプチャする場合、これを処理する適切な方法は、auto_now_addパラメータを使用することです。

date = models.DateField(_("Date"), auto_now_add=True)

ただし、modelfieldのドキュメントには、auto_now_addauto_now常に現在の日付を使用することが明確に記載されており、オーバーライドできるデフォルト値ではありません。


8
date = models.DateTimeField(default=datetime.now, blank=True)

5
DateTimeFieldは同じではありません。DateFieldのデフォルトとして日時を指定すると、問題が発生します。
onekiloparsec 2017

6

これを解決するためのより良い方法は、datetimecallableを使用することだと思います。

from datetime import datetime

date = models.DateField(default=datetime.now)

括弧は使用されていないことに注意してください。括弧を使用した場合は、now()関数を1回だけ(モデルの作成時)。代わりに、callableを引数として渡すため、モデルのインスタンスが作成されるたびに呼び出されます。

DjangoMusingsの功績。私はそれを使用し、正常に動作します。


4

これでうまくいくはずです:

models.DateTimeField(_("Date"), auto_now_add = True)

1
私の友人私はあなたがそれを間違って読んだと思います。質問は、DateTimeFieldではなくDateFieldに関するものです。
xxbinxx 2017

2

を使用することもできますlambdadjango.utils.timezone.nowを使用している場合に便利です

date = models.DateField(_("Date"), default=lambda: now().date())

6
ドキュメントを見てください。デフォルトの呼び出し可能なラッパーとしてラムダを使用するのは良くありません: Note that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.
pulina 2015年

@pulinaあなたは正しいが、この場合には、あなたが設定されたタイムゾーンにバインドさ日付を必要なときにのみ解決策のようなこのルックス
oxfn

いいえ。コードで実際の関数を指定できます。モデルの最上位関数である、これに関連する任意の関数またはメソッド参照。
pulina
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.