2013-10-07 25 views
1

我有2個單獨的django的服務器和在差位置django的模型使用數據庫服務器時間

MySQL服務器使用Django模型中,當嘗試創建/更新對象(如下面的代碼)。結果是3列和django服務器本地時間值相同。如何獲得數據庫服務器本地時間,當這樣做。

我的模型:

class Test(models.Model): 
    id = models.AutoField(primary_key = True, null = False) 
    create = models.DateTimeField(auto_now_add=True) 
    update = models.DateTimeField(auto_now=True) 
    test = models.DateTimeField(null=True) 

我的代碼:

y = Test() 
y.test = datetime.now() 
y.save() 

結果

id create    update    test     
------ ------------------- ------------------- ------------------- 
    6 2013-10-07 06:57:04 2013-10-07 06:57:04 2013-10-07 06:57:04 
+0

你想這麼做的原因是什麼?以UTC存儲時間通常是一個好主意,然後在演示期間轉換爲適當的時區。 –

+0

原因是我有一個數據庫服務器爲少數Web服務器。爲了一致,所有的數據應該使用數據庫服務器時間 – Hardy

+0

@哈迪你有沒有嘗試過Django數據庫函數的Now()https://docs.djangoproject.com/en/1.10/ref/models/database-functions/#now你有沒有解決它?如果是的話,你是如何做到的? – bkmagnetron

回答

1

我認爲你不能做你想做的,而不建立數據庫時區。讓我們來看看你的每個日期是什麼意思:

create = models.DateTimeField(auto_now_add=True) 

它自動設置日期到你添加它的時間。

update = models.DateTimeField(auto_now=True) 

它會自動將日期設置爲啓動進程(web進程或命令)的時間。

test = models.DateTimeField(null=True) 
... 
y.test = datetime.now() 

它將日期設置爲進程的時間(其中Django進程運行)。

要獲取數據庫時間,可以將數據庫的時區存儲在設置中,並在需要時使用它。你不能使用任何自動生成的字段。

另一種解決方案可能是手動(通過原始查詢)在數據庫上抓取本地時間。

0

如果你在Django中處理這個,django會在將數據保存到數據庫之前設置這些字段。在這種情況下,Django會根據您的應用程序服務器(運行django的服務器)設置時間。

您必須對MySql安裝進行一些設置(如果您尚未設置它們)。然後你必須重新創建你的表或者在數據庫中修改它們(我猜Django模型定義不能處理這個)。這是一個how-to doc explaning these settings

一個例子SQL CREATE TABLE語句將看起來像

CREATE TABLE test_test (
    create DATETIME DEFAULT CURRENT_TIMESTAMP, 
    update DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP 
) 

如果你已經有數據yotr表,那麼你可以執行改變而不是重新創建表。

然後,您必須編輯yor模型並將相關日期時間字段設置爲null,以便MySql可以設置它們。

class Test(models.Model): 
    id = models.AutoField(primary_key = True, null = False) 
    create = models.DateTimeField(null=True) 
    update = models.DateTimeField(null=True) 
    test = models.DateTimeField(null=True) 
相關問題