【问题标题】:How to migrate with south when using 'through' for a ManyToMany field?对多对多字段使用“通过”时如何向南迁移?
【发布时间】:2011-10-24 16:12:16
【问题描述】:

我想更改 django 应用中的 ManyToMany 字段。

我有以下型号:

class A:
    ...

class B:
    as = models.ManyToManyField(A)

我想要:

class A:
    ...

class C:
     a = models.ForeignKey(A)
     b = models.ForeignKey("B")
     extra_data = models.BooleanField(default=False)

class B:
    as = models.ManyToManyField(A, through=C)

我正在使用 south 进行数据库迁移。不幸的是,在这种情况下,South 建议删除现有的app_b_a 表并重新创建一个新的app_c

有没有办法对南说不要重新创建m2m表?

【问题讨论】:

    标签: python django django-south


    【解决方案1】:

    我会尝试以下方式:

    1. 添加C 模型,但不要向其中添加任何额外的数据字段。只需将 2 个 FK 设置为链接模型,使其架构实际上与默认的 m2m 表相同,除了表名。
    2. 为您的应用运行 schemamigration --auto
    3. 要有效地“删除”现有表并“创建”新表,而不移动数据,只需从forwards/backwards方法中删除所有生成的迁移代码并添加: 前锋: db.rename_table('yourappname_m2mtablename', 'yourappname_c') 向后: db.rename_table('yourappname_c', 'yourappname_m2mtablename')
    4. 让“冻结”模型保持原样!
    5. 现在您可以扩展您的 C 模型并为其生成新的架构迁移。

    【讨论】:

    • 如果新模型中的fk字段的名称对应于相应的模型,则可以正常工作。谢谢
    • 如果你的真实数据库表有像 foo_id 这样的列名,请将你在“C”模型中的字段名设为 foo。
    【解决方案2】:

    最近我不得不自己做这件事。其实很简单。

    首先,将新的直通模型添加到您的代码中,但不要将其指定为through 参数到您的ManyToManyField。创建一个自动架构迁移,它将为您创建新表。

    $ python manage.py schemamigration --auto yourapp
    

    其次,创建数据迁移:

    $ python manage.py datamigration yourapp name_of_migration
    

    在您的前向迁移中:

    for b in orm.B.objects.all():
        for a in b.as.all():
            orm.C.objects.create(a=a, b=b)
    

    在您的向后迁移中:

    for c in orm.C.objects.all():
        c.b.as.add(a)
    

    最后,将through 参数添加到您的ManyToManyField,并生成另一个自动架构迁移:

    $ python manage.py schemamigration --auto yourapp
    

    【讨论】:

    • 它工作正常。感谢您的提示。我可以接受这个,但我更喜欢 Beres 答案,它可以节省 1 次数据迁移并且不需要编写任何代码。
    • 什么是向后迁移中的 add(a)? a 没有在那里声明。
    【解决方案3】:

    您也可以尝试将 C 的 db_table 参数指定为“app_b_a”。但不确定这是否可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2012-07-13
      • 2011-01-14
      • 2016-03-30
      • 2012-01-25
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多