1

我在不同的位置有 2 个单独的 django 服务器和一个 mysql 服务器

尝试创建/更新对象时使用 django 模型(如下面的代码)。结果是具有相同 django 服务器本地时间值的 3 列。这样做时如何获取数据库服务器本地时间。

我的模型:

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  
4

2 回答 2

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 进程运行的地方)。

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

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

于 2013-10-07T07:59:48.237 回答
0

如果您在 Django 中处理此问题,django 将在将数据保存到数据库之前设置这些字段。在这种情况下,Django 将根据您的应用服务器(django 运行的服务器)设置时间。

您必须对 MySql 安装进行一些设置(如果您尚未设置它们)。然后你必须重新创建你的表或在你的数据库中改变它们(我猜 Django 模型定义不能处理这个)。这是解释这些设置的操作文档

一个示例 sqlCREATE TABLE 语句将如下所示

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

如果您已经在 yotr 表中有数据,那么您可以执行 ALTERs' 而不是重新创建表。

然后您必须编辑您的模型并将相关的日期时间字段设置为空,以便 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)
于 2013-10-07T08:29:09.987 回答