我有两个独立的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 :(得分: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)