如何解决ManyToManyField和向南迁移
| 我有带有M2M字段的用户个人资料模型class Account(models.Model):
...
friends = models.ManyToManyField(\'self\',symmetrical=True,blank=True)
...
现在我需要知道如何以及何时将彼此添加为朋友
我为此创建了一个模型
class Account(models.Model):
...
friends = models.ManyToManyField(\'self\',symmetrical=False,blank=True,through=\"Relationship\")
...
class Relationship(models.Model):
\"\"\" Friends \"\"\"
from_account = models.ForeignKey(Account,related_name=\"relationship_set_from_account\")
to_account = models.ForeignKey(Account,related_name=\"relationship_set_to_account\")
# ... some special fields for friends relationship
class Meta:
db_table = \"accounts_account_friends\"
unique_together = (\'from_account\',\'to_account\')
是否应为此更改创建任何迁移?
如果您有任何建议,请随时在此处写下。
谢谢
PS:“ 2”表已包含记录
解决方法
首先,如果可以的话,我会避免使用
db_table
别名。由于它不再与模型同步,因此使表结构更难理解。
其次,South API提供的功能类似于db.rename_table()
,可以通过手动编辑迁移文件来使用。您可以将“ 5”表重命名为“ 6”(如Django默认将其命名),然后添加其他列。
结合起来,可以进行以下迁移:
def forwards(self,orm):
# the Account.friends field is a many-to-many field which got a through= option now.
# Instead of dropping+creating the table (or aliasing in Django),# rename it,and add the required columns.
# Rename table
db.delete_unique(\'accounts_account_friends\',[\'from_account\',\'to_account\'])
db.rename_table(\'accounts_account_friends\',\'accounts_relationship\')
# Add extra fields
db.add_column(\'accounts_relationship\',\'some_field\',...)
# Restore unique constraint
db.create_unique(\'accounts_relationship\',\'to_account\'])
def backwards(self,orm):
# Delete columns
db.delete_column(\'accounts_relationship\',\'some_field\')
db.delete_unique(\'accounts_relationship\',\'to_account\'])
# Rename table
db.rename_table(\'accounts_relationship\',\'accounts_account_friends\')
db.create_unique(\'accounts_account_friends\',\'to_account\'])
models = {
# Copy this from the final-migration.py file,see below
}
唯一关系将被删除并重新创建,因此约束具有正确的名称。
使用以下技巧可以轻松生成add列语句:
仅在带有外键字段的models.py
中添加Relationship
模型,并且尚未更改M2M字段。
迁移到它
将字段添加到“ 8”模型中。
a11ѭ
还原第一次迁移。
这样便拥有了构建迁移文件所需的一切。
,在其中进行编码的方式是,您手动定义一个模型,该模型的作用与Django将自动为您创建的m2m连接表相同。问题是,自动创建的表将被称为accounts_relationship_friend
。
因此,您在此处所做的操作将创建一个模型,该模型试图复制ORM在表面下所做的操作,但是它指向错误的表。
如果您不需要显式的联接模型,则可以将其从代码库中删除,而不创建要添加它的迁移,而是使用M2M查找好友之间的关系。 (我对此的思考不是太深,但是应该可以)。
但是,如果您想对自己的关系模型做一些特殊的事情(例如,存储有关关系类型的属性等),我将把关系模型声明为您在Friend.friends m2m定义中使用的直通模型。请参阅此处的文档。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。