B
B
Boldy2014-12-12 10:04:34
Django
Boldy, 2014-12-12 10:04:34

Manage.py makemigrations creates incorrect migrations. How to fix?

Added three optional fields to the model, but manage.py makemigrations creates migrations of the CreateTable type (the last three fields are not in the table, ) instead of AlterTable or AlterField:

migrations.CreateModel(
            name='InviteBonus',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('total', models.DecimalField(verbose_name='\u0421\u0443\u043c\u043c\u0430 \u043f\u043b\u0430\u0442\u0435\u0436\u0430', max_digits=12, decimal_places=2)),
                ('use_date', models.DateField(verbose_name='\u0414\u0430\u0442\u0430 \u043f\u043b\u0430\u0442\u0435\u0436\u0430')),
                ('line', models.PositiveIntegerField(null=True, verbose_name='\u043b\u0438\u043d\u0438\u044f', blank=True)),
                ('paid', models.BooleanField(default=False, verbose_name='\u0412\u044b\u043f\u043b\u0430\u0447\u0435\u043d\u043e')),
                ('five_per_period', models.BooleanField(default=False, verbose_name='\u043f\u044f\u0442\u044c \u0437\u0430 \u043f\u0435\u0440\u0438\u043e\u0434')),
                ('comment', models.CharField(max_length=100, verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439')),
                ('inviter', models.ForeignKey(related_name='invite_bonuses', default=None, verbose_name='\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a', to='accounts.TreeNode')),
                ('newbie', models.ForeignKey(related_name='awards', verbose_name='\u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0451\u043d\u043d\u044b\u0439', blank=True, to='accounts.TreeNode', null=True)),
            ],
            options={
                'db_table': 'invite_bonuses',
                'verbose_name': '\u0432\u044b\u043f\u043b\u0430\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0437\u0430 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435',
                'verbose_name_plural': '\u0432\u044b\u043f\u043b\u0430\u0442\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0437\u0430 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f',
            },
            bases=(models.Model,),
        ),

What I did:
- Deleted the migrations folder
- Cleaned up the django_migrations table
Then ran
manage.py makemigrations
  manage.py migrate - FAKED, потому что таблица уже есть, поэтому нужно делать добавление полей вместо создания таблицы
  manage.py syncdb - Тоже ни о чём

Answer the question

In order to leave comments, you need to log in

2 answer(s)
K
kazmiruk, 2014-12-12
@Boldy

Все запутано, но судя по всему Django ведет себя верно: Вы удалили все миграции и теперь джанго думает, что миграций нет (и мало того они не накачены, так как Вы почистили таблицу). Именно поэтому она создает миграцию с create table, а не alter table. Как вариант исправления - восстановить миграцию, которая создает таблицу без добавленных 3х полей: можно удалить 3 поля из модели, создать миграцию, затем добавить их и создать вторую миграцию, добавить информацию о первой маиграции в django_migrations (как будто она накачена) и затем накатить через migrate вторую миграциюю.

V
Vladislav, 2014-12-12
@RGV

Django is not bound to a database. The first migration will always create new tables from models.
migrations is better not to touch and just accompany with the application.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question