日時フィールドを持つモデルがあります。
date = models.DateField(_("Date"), default=datetime.now())
組み込みのdjangoadminでアプリをチェックするとDateField
、時間も追加されているため、保存しようとするとエラーが返されます。デフォルトを日付だけにするにはどうすればよいですか?(datetime.today()
どちらも機能していません)
回答:
そのため、モジュール内のクラスではなく、常に基本datetime
モジュールをインポートimport datetime
する必要datetime
がありますfrom datetime import datetime
。
あなたが犯した他の間違いは、実際にデフォルトで関数を呼び出すことです()
。これは、すべてのモデルがクラスが最初に定義されたときに日付を取得することを意味します。したがって、サーバーがApacheを再起動せずに数日または数週間稼働している場合、すべての要素は同じ初期日付を取得します。
したがって、フィールドは次のようになります。
import datetime
date = models.DateField(_("Date"), default=datetime.date.today)
_("Date")
てるの?
あなたの間違いは、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_add
とauto_now
は常に現在の日付を使用することが明確に記載されており、オーバーライドできるデフォルト値ではありません。
date = models.DateTimeField(default=datetime.now, blank=True)
これを解決するためのより良い方法は、datetimecallableを使用することだと思います。
from datetime import datetime
date = models.DateField(default=datetime.now)
括弧は使用されていないことに注意してください。括弧を使用した場合は、now()
関数を1回だけ(モデルの作成時)。代わりに、callableを引数として渡すため、モデルのインスタンスが作成されるたびに呼び出されます。
DjangoMusingsの功績。私はそれを使用し、正常に動作します。
これでうまくいくはずです:
models.DateTimeField(_("Date"), auto_now_add = True)
を使用することもできますlambda
。django.utils.timezone.nowを使用している場合に便利です
date = models.DateField(_("Date"), default=lambda: now().date())
Note that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.