Преждевременная проверка полей в миграциях Django - PullRequest
0 голосов
/ 31 октября 2019

У меня есть следующая проблема:

Я работаю над приложением Django, у которого есть основная БД, и теперь мы добавляем дополнительную БД для синхронизации только некоторых данных в ней. Когда я попытался запустить миграцию, я получил ошибку: нулевое значение в столбце 'field_2' нарушает ограничение not-null. И вот вопрос:

Модель:

class A(models.Model):
   field_1 = models.BooleanField(default=False)
   field_2 = models.BooleanField(default=True) # added later

   field_3 = models.BooleanField(default=True) # added later

и 4 миграции (ну, еще, но те не в счет):

0001 - связанныймодель создана

0002 - создана модель A и создана связь (ForeignKey)

0003 - поле_2 добавлено в модель A

0004 - поле_3 добавлено в модельA

Однако, когда я запускаю миграцию на новую БД, миграция останавливается на миграции 0002 с упомянутой выше ошибкой:

django.db.utils.IntegrityError: нулевое значение в столбце«field_2» нарушает ненулевое ограничение

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

Редактировать:

Миграция 0001:

class Migration(migrations.Migration): 
 initial = True
 dependencies = []
 operations = [
        migrations.CreateModel(
            name='B',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=100)),
                ('year', models.IntegerField()),
                ('active', models.BooleanField(default=True)),

            ],
        ) 
    ]

Миграция 0002:

class Migration(migrations.Migration): 

 dependencies = ['app', '0001']
 operations = [
        migrations.CreateModel(
            name='A',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('field_1', models.BooleanField(default=False))
            ],
        ),
        migrations.AddField(
            model_name='b',
            name='a',
            field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.B'),
        ),
    ]

Миграция 0003:

class Migration(migrations.Migration): 

 dependencies = ['app', '0002']

 operations = [
        migrations.AddField(
            model_name='a',
            name='field_2',
            field=models.BooleanField(default=True),
        ),
    ]

Миграция 0004:

class Migration(migrations.Migration): 

 dependencies = ['app', '0003']

 operations = [
        migrations.AddField(
            model_name='a',
            name='field_3',
            field=models.BooleanField(default=True),
        ),
    ]

Миграция: 0001

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...