Django: le fuseau horaire.maintenant vs fuseau horaire.maintenant()
Je suis dans le processus de mise à jour de mon projet de Django 1.8.2 à 1.9.7 et je suis de cet avertissement:
WARNINGS:
my_app.my_model.date_available: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want.
If you want to have the current date as default, use `django.utils.timezone.now
Voici la ligne de my_app/models.py:
from django.utils import timezone
...
class my_model(models.Model):
...
datetime_released = models.DateTimeField(default=timezone.now() )
Si je supprime les parenthèses et utiliser à la place:
datetime_released = models.DateTimeField(default=timezone.now )
Le Django d'avertissement disparaît. Quelle est la différence entre les deux?
Dans un autre domaine de mon projet, je suis à l'aide du fuseau horaire.maintenant() dans un queryset filtre:
def date_available(self):
return self.filter(date_available__lte = timezone.now())
Ici, si je supprime les parenthèses, une erreur est levée:
TypeError: expected string or buffer
Je peux obtenir à la fois de ces deux travaux en ajoutant/enlevant les parenthèses comme nécessaire, mais quelle est la différence entre timezone.now()
et timezone.now
et pourquoi font-ils la cause des avertissements/erreurs dans ces cas?
OriginalL'auteur 43Tesseracts | 2016-07-07
Vous devez vous connecter pour publier un commentaire.
En python, tout est objet, y compris des fonctions. Cela signifie que vous pouvez affecter une fonction à une variable:
Une fonction est un objet appelable:
Quand
default
reçoit un callable, le callable est appelée chaque fois qu'une valeur par défaut est demandé.D'autre part, lorsque vous appelez
timezone.now()
avant le réglage de l'default
, la valeur est donnée et fixe. Pour rappel, la ligne suivante est exécutée qu'une seule fois au démarrage du serveur, puisqu'il est un attribut de classe:et donc
timezone.now()
est exécutée qu'une seule fois. Le passage d'un callabletimezone.now
permet de recalculer la valeur chaque fois qu'il doit être.OriginalL'auteur Antoine Pinsard
La différence est que
timezone.now
est un callable qui est exécutée au moment de l'exécution, tandis quetimezone.now()
renvoie le résultat de cette fonction.Pour la
models.DateTimeField
, vous devez utiliser le appelable. Mieux encore, il suffit de définirauto_now_add
qui le fait pour vous:Le filtre sur l'autre main pour ne pas accepter un callable - il nécessite une valeur. Par conséquent, vous devez évaluer
timezone.now()
lors du passage de cela comme un argument pour le filtre.timezone.now()
, vous êtes effectivement en passant la sortie de cette fonction au moment de django bottes (c'est quand il devient évalué), tandis que lorsque vous passeztimezone.now
vous êtes de passage de la fonction de l'objet qui devient paresseusement évalué par django.Que faire si vous voulez avoir un modèle qui a un timestamp de création? Serait la
timezone.now()
être mieux dans ce cas quetimezone.now
, qui finira par être réévalué chaque si souvent?OriginalL'auteur solarissmoke
Dans
self.filter(date_available__lte = timezone.now())
vous voulez faire une requête à la base de données basée sur l'heure actuelle. Si vous en avez besoin dans un format de chaîne.Dans
datetime_released = models.DateTimeField(default=timezone.now)
vous voulez par défaut à l'heure actuelle. Si vous ne pouvez pas avoir une chaîne de caractères. Au lieu de vous fournir une fonction qui renvoie l'heure actuelle.OriginalL'auteur Arun Ghosh
maintenant() est exécuté lorsque le modèle est chargé et retourne un objet datetime /chaîne de temps au chargement. (d'où le Django attention!)
(Le fichier de modèle, si elle est pleinement exécutée lorsque le serveur démarre)
maintenant va passer sur la méthode, et sera exécuté uniquement lorsque la classe/du modèle est instanciée, la création de l'affichage de l'heure au bon moment (dans le bon sens, et que la plupart des gens essaient de l'atteindre).
Dans l'exemple de filtre, il n'est appelé lorsque le filtre de la fonction est appelée.
si vous n'avez pas exécuté (maintenant()) et permettra de nourrir la méthode, et ne sera jamais à produire les objet datetime. (erreur, attend une chaîne de caractères, got, quelque chose d'autre)
OriginalL'auteur gtalarico