web-dev-qa-db-fra.com

"Valeur par défaut fixe fournie" après la mise à niveau vers Django 1.8

Django 1.8 a maintenant une détection de problèmes pour les modèles, ce qui est bien. Cependant, pour un avertissement qu'il me donne, je comprends le problème, mais je ne comprends pas comment l'indication qu'il me donne est meilleure.

Voici mon (mauvais) champ de modèle:

my_date = DateField(default=datetime.now())

et il est facile de voir pourquoi c'est mauvais. Mais c'est l'indice que cela me donne:

MyMoel.my_date: (fields.W161) Valeur par défaut fixe fournie.
CONSEIL: Il semble que vous ayez défini une valeur date/heure/date/heure fixe par défaut pour ce champ. Ce n'est peut-être pas ce que vous voulez. Si vous souhaitez avoir la date actuelle par défaut, utilisez `Django.utils.timezone.now`

Donc, il dit d'utiliser timezone.now, mais comment est-ce mieux que datetime.now? Ce sont les deux "valeurs par défaut fixes" ... timezone.now juste retourne une instance datetime, qui est une valeur fixe ...

Je soupçonne qu'il veut en fait que j'insère une sorte de drapeau qui dit "use timezone.nowplus tard ". Mais ce n'est pas ce que dit l'indice ... alors quel est ce drapeau?

27
Troy

La fonction datetime.now() est actuellement exécutée dès que votre code est importé, c'est-à-dire lorsque vous (re) démarrez votre serveur. Toutes les instances de modèle suivantes auront la même valeur.

Au lieu de cela, vous devez passer une fonction appelable à default, qui est exécutée chaque fois qu'une instance de modèle a besoin d'une valeur par défaut. L'astuce veut indiquer que vous devez littéralement utiliser DateField(default=Django.utils.timezone.now) sans les parenthèses.

Le message est légèrement trompeur, mais Django ne sait pas si vous avez utilisé datetime.now() ou Django.utils.timezone.now().

65
knbk