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

[英]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.

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

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:

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

Models.py

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)

Thank you

谢谢

1 个解决方案

#1


6  

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不会修改现有表(模型)。发生了什么,即使添加M2M不修改表(它应该只添加一个连接表),syncdb也不会创建新表,因为它看到模型已经在数据库中并且它正在跳过它。请参阅syncdb文档

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

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

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.

通常,django不提供迁移数据库模式的机制(即添加列等)。因此,您必须通过原始SQL或使用第三方工具来执行此类操作。我强烈建议退房南方。


注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:http://www.itdaan.com/blog/2010/10/21/4493081f0ce42976868e01bb69959c69.html



 
© 2014-2018 ITdaan.com 粤ICP备14056181号