4

Когда я выполнить миграцию на одном из моего приложения проектов я получаю следующее сообщение об ошибке:Unhandled в ожидании операции для моделей при попытке выполнить миграцию

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), 
     ), 
    ] 
+1

Не могли бы вы опубликовать определение оскорбительных моделей? –

+0

Не могли бы вы разместить миграции для приложений «common» и «catalog», а также для полной отслеживания? – knbk

+0

Я редактирую вопрос фактическая миграция, которую я делаю, находится в другом приложении (ни один из перечисленных выше) – segalle

ответ

4

Хорошо я получил его!

кажется, что процесс миграции перешел все мои предыдущие миграции, а не только на последнем ... в один из предыдущих миграций был неправильно внешний ключ указателя, который вызвал эту проблему

Я неподвижную эта старая миграция и это!

+3

Это глупо. Из-за этого поведение Django прерывает миграцию, когда имя модели изменяется. –

+0

@MJafarMash Вы нашли обходное решение? Я изменил имена моделей, и у меня есть некоторые связанные с ними поля ManyToMany, и он обрывается с этим сообщением об ошибке. – fidelitas

+2

@fidelitas Я изменил имена моделей в старых миграциях. Но это делает старые миграции бесполезными для других людей. –

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 и имеющий to ссылку на новую модель в поле ForeignKey.

Это было протестировано на Django 1.9.12.

+1

Через год после моего первоначального сообщения лучший способ - убедиться, что зависимости находятся в правильный порядок ... и тогда вам не нужно будет переименовывать что-нибудь ура – segalle