8

我向现有模型添加了一个多对多字段,并希望syncdb创建一个新表,但那里什么都没有。这是模型的样子:

class Author(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()

    def __unicode__(self):
        return "{0} {1}".format(self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

    def __unicode__(self):
        return self.title

运行sql myapp使用新表打印正确的语句,但这在我运行时没有反映出来syncdbvalidate也没有返回错误。有谁知道这里可能是什么问题?还是更好的诊断方法?

4

2 回答 2

15

根据设计,syncdb 命令不会为现有模型创建多对多表。此决定在票 2229上进行了解释。

这给你留下了几个选择。

  • 如果您的 Book 模型中没有任何数据,请删除该表并重新运行 syncdb。Django 将重新创建 book 表和多对多表。
  • 使用 dbshel​​l 命令,并使用 sql myapp 的输出创建多对多连接表。
  • 如果您使用 Django 进行多个模式迁移,请与South交朋友。
于 2012-12-24T01:28:53.850 回答
5

我在 django 文档中发现这个解释很有用:SchemaEvolution

数据库迁移的事实标准是 Django South。

它并不完美,但是,它工作得很好。在运行迁移文件之前,您应该始终检查(并在必要时进行编辑),以确保它确实完成了它应该做的事情。你可以在这里查看他们的教程。

此外,如果您运行:

python manage.py inspectdb > somefile.txt

您可以快速检查您的数据库结构是否与您的 django 模型匹配。

于 2012-12-24T02:46:58.060 回答