2009-12-08 7 views
3

Je travaille sur une application Django où j'ai besoin que tous les champs datetime représentés soient enregistrés en UTC (comme ils le devraient). Lorsque je crée des modèles avec des champs DateTime, la représentation de la base de données est générée sous la forme "horodatage avec fuseau horaire". Bien que je puisse modifier manuellement les tables pour supprimer le fuseau horaire des champs, je me demandais si le champ DateTime avait la capacité de ne pas le faire - c.-à-d., Créer "timestamp with out time zone" pour certains champs. Est-ce possible? Ou dois-je les modifier? Merci, HarelChamp DateTime de Django pour générer des champs d'horodatage avec le fuseau horaireOUT

Répondre

4

Les types de données pour postgres sur la carte Django à la chaîne littérale timestamp with time zone, et il ne semble pas être une option pour modifier ce type.

Pour autant que je sache, vous avez trois options:

  1. Tirez le meilleur parti du crochet de Django pour l'exécution raw sql after the create table statement. Pour ce faire, créez un répertoire appelé sql dans votre application et un fichier dans ce répertoire appelé mymodel.postgres_psycopg2.sql. Placez vos instructions alter table là-bas.

  2. Écrivez un champ personnalisé pour définir les modificateurs pour le champ d'horodatage comme bon vous semble. Voir "writing custom model fields".

  3. Laissez le champ django tel quel et effectuez la conversion du fuseau horaire dans votre application afin d'être certain que vous passez l'heure correcte.

Ma préférence personnelle pour l'intégrité des données est # 3. Tout comme avec les encodages de caractères, où vous voulez toujours être sûr de connaître le jeu de caractères et gérer les conversions correctement, je me sens beaucoup plus à l'aise avec les dates/heures dont les attributs (y compris TZ) sont aussi précisément définis. Vous pouvez être certain aujourd'hui que toutes vos entrées arrivent déjà dans votre application en UTC, mais cela peut changer, en particulier si les horodateurs sont fournis par les utilisateurs finaux. Pour ce que ça vaut, je vais faire un effort supplémentaire, convertir l'horodatage dans l'application en UTC, et le stocker dans la base de données avec UTC comme fuseau horaire.

+0

Merci Jarret, Je fais la conversion de fuseau horaire dans mon application comme il est, car je ne fais confiance à personne avec des fuseaux horaires, o) J'ai l'intention de stocker toutes les dates comme UTC, et puisque je connais le fuseau horaire d'un utilisateur , toutes les dates saisies par l'utilisateur seront converties en UTC avant de sauvegarder quoi que ce soit dans la base de données. Cependant, je voudrais aussi traiter les dates de création/modification en UTC, mais il semble que Django sauvegardera le décalage de fuseau horaire dans le champ même si mes paramètres.TIMEZONE est UTC (si je sauvegarde la date de création au 25 nov l'enregistrerait comme décalage de +01 depuis que le Royaume-Uni était en heure d'été, donc pourquoi je veux tuer l'info de db tz – Harel

+0

Ca a du sens ... dans ce cas, je voterais pour l'option # 1 ci-dessus –

+1

est de lancer le serveur lui-même en UTC http://serverfault.com/questions/14685/local-timezones-on-servers-considered-harmful – Harel