Django 同步数据库问题

2 投票
2 回答
5032 浏览
提问于 2025-04-15 23:07

在Django的模型中,假设这个模型存在于details/models.py文件里。

    class OccDetails(models.Model):
       title = models.CharField(max_length = 255)
       occ = models.ForeignKey(Occ)

当我们执行数据库同步时,会创建出以下这些字段。

后来又添加了两个新字段,但在再次同步数据库时,这些新字段并没有被创建。这个问题该怎么解决呢?另外,下面提到的auto_now=true是什么意思呢?

这些是新添加的字段:

         created_date = models.DateTimeField(auto_now_add=True)
         modified_date = models.DateTimeField(auto_now_add=True, auto_now=True)

2 个回答

3

这是一个在Django中常见的问题。正如Amarghosh所说,syncdb无法修改已经存在的表的结构。

South是为了解决这个问题而创建的。

我推荐使用它。

7

syncdb 是一个命令,它会为所有在 INSTALLED_APPS 列表中的应用创建数据库表,前提是这些表还没有被创建。

Syncdb 不会修改已经存在的表
syncdb 只会为那些还没有安装的模型创建表。它不会执行 ALTER TABLE 这样的命令来更新已经安装的模型类的表结构。如果模型类和数据库结构发生了变化,通常会有一些不确定性,这时候 Django 可能会猜测该做什么更改。这可能会导致重要数据的丢失。

你可以选择:

  • 手动执行 ALTER TABLE 命令
  • 使用 DROP TABLE 删除特定的表(这样会丢失数据),然后再运行 syncdb
  • 运行 django-admin sqlclear 来获取清空整个数据库的 SQL 语句列表,并执行这些命令(这会清空数据库 - 你会丢失所有现有数据)或者

DateField.auto_now:每次保存对象时,自动将这个字段设置为 NOW()。这对于记录“最后修改”时间戳非常有用。请注意,始终使用当前日期;这不是一个可以覆盖的默认值。

因此,每次你调用 object.save() 时,modified_date 列会自动更新。

撰写回答