2009-12-08 148 views
3

我正在使用Django應用程序,我需要以UTC保存所有postgres表示的日期時間字段(他們應該)。當我使用日期時間字段創建模型時,他們將數據庫表示形式生成爲「時間戳,時區爲」。 儘管我可以手動修改表格以從字段中刪除時區,但我想知道DateTime模型字段是否有能力不這樣做 - 即爲某些字段創建「時間戳帶有時區」。 這可能嗎?或者我必須改變它們的表格? 謝謝, HarelDjango DateTime字段生成沒有時區的時間戳字段

回答

4

Django中postgres的數據類型映射到字符串文字timestamp with time zone,似乎沒有改變該類型的選項。

據我所知,你有三種選擇:

  1. 充分利用Django的鉤執行raw sql after the create table statement。爲此,請在您的應用中創建一個名爲sql的目錄,並在該目錄中創建一個名爲mymodel.postgres_psycopg2.sql的文件。將您的alter table語句放在那裏。

  2. 編寫自定義字段以根據需要定義時間戳字段的修飾符。參見「writing custom model fields」。

  3. 讓django字段保持原樣,並在應用程序中執行時區轉換,以便您完全確定您正在傳遞正確的時間。

我個人對數據完整性的偏好是#3。就像字符編碼一樣,在那裏你總是想知道字符集並正確處理轉換,對於其屬性(包括TZ)被精確定義的日期/時間,我感覺更加舒適。您今天可能確定您的所有輸入已經以UTC來到您的應用程序,但可能會發生變化,特別是如果時間戳由最終用戶提供。對於它的價值,我會多花一點時間,將應用程序中的時間戳轉換爲UTC,然後將其存儲在數據庫中,以UTC作爲時區。

+0

謝謝Jarret, 我在我的應用程序中進行時區轉換,因爲我不信任任何具有時區的人; o)我打算將所有日期存儲爲UTC,並且由於我知道用戶的時區,所有用戶輸入的日期都將轉換爲UTC,然後將任何內容保存到數據庫。 但是,我想將創建/修改日期當作UTC來處理,但是好像Django會在字段中保存時區偏移量,即使我的settings.TIMEZONE是UTC(如果我在第25天保存了創建日期將它保存爲+01的偏移量,因爲英國在DST那一次。因此,爲什麼我想殺死db tz info。 – Harel 2009-12-08 20:29:07

+0

有道理......在這種情況下,我會投票選擇上面的選項# – 2009-12-08 20:32:37

+1

另一種選擇是以UTC運行服務器本身。 http://serverfault.com/questions/14685/local-timezones-on-servers-considered-harmful – Harel 2009-12-08 22:21:02