django将ManyToMany字段/表添加到现有模式,related_name错误

时间:2010-10-21 16:28:10

标签: django many-to-many field

我有一个包含模型的现有项目(用户和图书)。我想在现有模型Books中添加ManyToMany(M2M)字段,但syncbb命令不会这样做。

详细信息:图书已经有一个映射到用户的FK字段,我想添加一个也映射到用户的新M2M字段(阅读器)。如你所知,Django的syncdb只关心表,所以添加一个普通字段很容易,但是M2M需要一个新的连接表(app_books_user),所以不应该像任何其他新表那样使用syncdb cmd添加它吗?它为Book的'卖家'领域创建了我的另一个联合表。

当我运行syncdb时,我最初收到错误,指示我使用'related_name'参数来帮助区分对User的两个引用。我加了那些。但是,当我再次运行syncdb时,它不会创建新的连接表(但它现在没有错误)。当我通过Shell查看它时存在新字段,但是不能使用它b / c连接表不存在。我通过'sqlall'cmd查看了sql代码,并打印出新表的SQL,但它没有被执行。

我错过了什么?我应该通过我的数据库浏览器强制SQL(来自sqlall)吗?这有什么影响吗?代码如下:

Models.py

from django.contrib.auth.models import User

class Seller(models.Model):
    ...

class Books(models.Model):

    name=models.CharField(max_length=50)
    author=models.ForeignKey(User, related_name='creator')
    readers=models.ManyToManyField(User, blank=True, related_name='viewers')
    sellers=models.ManyToManyField(Seller)

谢谢

1 个答案:

答案 0 :(得分:6)

syncdb不会修改现有表(模型)。发生的事情是,即使添加M2M不修改表(它应该只添加连接表),syncdb也不会创建新表,因为它看到模型已经在数据库中并且它正在跳过它。请参阅syncdb docs

  

[syncdb]为尚未创建表的INSTALLED_APPS中的所有应用创建数据库表。

这有点令人困惑,因为从技术上讲这个表尚未创建,但行为有意义“是否已创建此模型的表?是的!然后不要同步它。”

通常,django不提供迁移数据库模式的机制(即添加列等)。所以,你必须通过原始SQL或使用第三方工具来做这种事情。我强烈建议您查看South