【问题标题】:Unhandled pending operations for models when trying to perform migration尝试执行迁移时模型的未处理挂起操作
【发布时间】:2016-03-19 22:41:26
【问题描述】:

当我对我的一个项目应用程序执行迁移时,我收到以下错误:

ValueError:模型的未处理挂起操作: common.shipmentaddress(字段引用:catalog.Fulfillment.address)

Django 1.9,python 2.7.10

我一直在寻找循环导入,但我认为不是这样

这些是模型:

class ShipmentAddress(models.Model):
    recipient_first_name = models.CharField(max_length=50, null=True, blank=True)
    recipient_last_name = models.CharField(max_length=50, null=True, blank=True)
    street_name = models.CharField(max_length=50)
    state = models.ForeignKey(State)
    postal_code = models.IntegerField(default=0)
    city = models.CharField(max_length=50)

    class Meta:
        db_table = 'shipment_address'


class Fulfillment(models.Model):
    address = models.ForeignKey(ShipmentAddress)
    inventory_items = models.ManyToManyField(Item_With_Size, through='Inventory_Item')

    class Meta:
        verbose_name = 'fulfilment'
        verbose_name_plural = 'fulfilments'
        db_table = 'fulfilment'

迁移看起来像这样:

class Migration(migrations.Migration):

    dependencies = [
        ('catalog', '0009_auto_20151130_1118'),
     ]

    operations = [
        migrations.AlterField(
            model_name='fulfillment',
            name='address',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='common.ShipmentAddress'),
        ),
    ]

class Migration(migrations.Migration):

    dependencies = [
        ('common', '0005_shipmentaddress'),
    ]

    operations = [
        migrations.RenameField(
            model_name='shipmentaddress',
            old_name='recipient_name',
            new_name='recipient_first_name',
        ),
        migrations.AddField(
            model_name='shipmentaddress',
            name='recipient_last_name',
            field=models.CharField(blank=True, max_length=50, null=True),
        ),
    ]

【问题讨论】:

  • 你能发布有问题的模型定义吗?
  • 您能否发布commoncatalog 应用程序的迁移以及完整的回溯?
  • 我编辑了我所做的实际迁移是在其他应用程序上的问题(以上都不是)

标签: python django django-models database-migration django-1.9


【解决方案1】:

好的,我明白了!

迁移过程似乎遍历了我之前的所有迁移,而不仅仅是最后一个迁移......在之前的一次迁移中,有一个错误的外键指针导致了这个问题

我修复了旧的迁移,就是这样!

【讨论】:

  • 这很愚蠢。由于这种行为而更改模型名称时,Django 会中断迁移。
  • @MJafarMash 您找到解决方法了吗?我更改了模型名称,并且我有一些相关的 ManyToMany 字段,它会因此错误消息而中断。
  • @fidelitas 我在旧迁移中更改了模型名称。但这使得旧迁移对其他人毫无用处
  • @MJafarMash 你是对的,幸运的是我最近做了迁移重置,所以没有人会再次使用这些
【解决方案2】:

对于那些重命名 Django ForeignKey 中引用的模型的人,我为这个问题找到的不同解决方案是在以后的迁移中重新定义该字段。这避免了必须编辑现有迁移。

如果您在第一次迁移中有以下操作(自动添加):

    migrations.AddField(
                model_name='my_model',
                name='my_fk',
                field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='my_app.old_model_name'),
            )

old_model_name重命名为new_model_name的迁移中手动添加如下操作:

    migrations.AlterField(
                model_name='my_model',
                name='my_fk',                
                field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='my_app.new_model_name'),
            )

两者之间的区别在于调用AlterField 而不是AddField 并让toForeignKey 字段中引用新型号名称。

这是在 Django 1.9.12 上测试的。

【讨论】:

  • 在我的原始帖子发布一年后,最好的方法是确保依赖项的顺序正确......然后你就不需要重命名任何东西了
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 2020-10-30
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
相关资源
最近更新 更多