[英]django adding a ManyToMany field/table to existing schema, related_name error

I have an existing project with models (Users and Books). I would like to add a ManyToMany(M2M) field to the existing model Books, but the syncbb command does not do this.


Details: Books already has a FK field that maps to User, and I want to add a new M2M field (readers) that also maps to User. As you know, Django's syncdb only cares about tables, so adding a normal field is easy, but a M2M requires a new join table (app_books_user), so shouldn't syncdb cmd add this like any other new table? It created my other joined table for the Book's 'sellers' field.

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

When I ran syncdb, I initially received an error instructing me to use the 'related_name' argument to help differentiate the two references to User. I added those. However, when I run syncdb again, it does not create the new join table (but it's now error-free). The new field exists when I view it via the Shell, but can't use it b/c the join table doesn't exist. I looked at the sql code via 'sqlall' cmd and it prints out the SQL for the new table, but it doesn't get executed.

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

What am I missing? Should I just force the SQL (from the sqlall) via my database browser? Will that have any repercussions? Code follows:


from django.contrib.auth.models import User

class Seller(models.Model):

class Books(models.Model):

    author=models.ForeignKey(User, related_name='creator')
    readers=models.ManyToManyField(User, blank=True, related_name='viewers')

Thank you


1 个解决方案



syncdb does not modify existing tables (models). What's going on is that even though adding a M2M does not modify a table (it should just add a join table), the syncdb is not creating the new table because it sees that the model is already in the db and it is skipping it. See the syncdb docs


[syncdb] Creates the database tables for all apps in INSTALLED_APPS whose tables have not already been created.


It is a bit confusing, since technically this table hasn't been created, but the behavior makes sense "Has the table for this model been created? Yep! Then don't sync it."


In general, django does not provide a mechanism to migrate database schemas (ie add columns and such). So, you have to do that sort of a thing via raw SQL or by using a third party tool. I highly recommend checking out South.




© 2014-2019 粤ICP备14056181号