2017-09-12 1 views
0

J'ai un modèle "Membre" où il y a deux champs "created_at" et "updated_at". A l'origine, ils ont été définis comme suit:Enregistrer un enregistrement et Mettre à jour l'heure non stocké dans localtime django

created_at = models.DateTimeField(auto_now_add=True, null=True) 
updated_at = models.DateTimeField(auto_now_add=True, null=True) 

mon settings.py ont USE_TZ = True et TIME_ZONE = "Amérique/New_York".

J'ai un middleware personnalisé défini pour activer le fuseau horaire sélectionné par l'utilisateur.

current_tz = pytz.timezone("<user defined timezone>") 
timezone.activate(current_tz) 

Ensuite, mettre à jour les champs pour stocker les localtime utilisateur:

created_at = models.DateTimeField(default= lambda: timezone.localtime(timezone.now()), null=True) 
updated_at = models.DateTimeField(default= lambda: timezone.localtime(timezone.now()), null=True) 

Maintenant, quand je mets à jour le dossier de membre et vérifier la updated_at temps, son montrant le même fuseau horaire UTC au lieu de l'heure locale de l'utilisateur.

Est-ce que django toujours stocke des valeurs datetime dans DB en UTC ou que je manque quelque chose ici

+0

Ce code n'utilisera jamais que l'heure locale du serveur, pas l'utilisateur. –

+0

J'ai édité ma question pour mentionner un middleware qui est en place pour activer le fuseau horaire selon le fuseau horaire sélectionné par l'utilisateur. Alors, comment faire pour utiliser l'heure locale de l'utilisateur, pas le serveur? – user2722127

+1

Assez juste. Mais cela semble toujours une mauvaise idée. Pourquoi est-ce que vous voulez stocker l'heure locale, plutôt que - comme le recommande explicitement [dans la documentation] (https://docs.djangoproject.com/en/1.11/topics/i18n/timezones/) - stockage UTC et la conversion en sortie ? –

Répondre

1

Tous vos besoins devrait se concentrer sur USE_TZ = True.

Si vous définissez USE_TZ = True, le champ DateTimeField stocke l'heure UTC. Si vous commentez le USE_TZ = True dans votre settings.py, vous pouvez obtenir ce que vous voulez.

Mais dans le projet, vous devriez toujours mieux ouvrir le USE_TZ, si USE_TZ ouvert, tout le magasin ou le traitement interne, même impression, sont fuseau horaire UTC. lorsque vous montrez dans les modèles, il est très pratique pour time format conversion.