微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ManyToManyField和向南迁移

如何解决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 举报,一经查实,本站将立刻删除。