django模型使用数据库服务器时间

时间:2013-10-07 07:40:00

标签: python mysql django django-models

我有两个独立的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  

2 个答案:

答案 0 :(得分: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进程运行的地方)。

要获取数据库时间,您可以在设置中存储数据库的时区,并在需要时使用它。您不能使用任何自动生成的字段。

另一种解决方案可能是在数据库上手动(通过原始查询)获取本地时间。

答案 1 :(得分: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表中有数据,那么你可以执行ALTERs'而不是重新创建表。

然后你必须编辑你的模型并将相关的日期时间字段设置为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)