Почему моя автоматически генерируемая миграция выдает ошибку при запуске? - PullRequest
0 голосов
/ 02 апреля 2019

Я использую Python 3.7, Django и PostGres 9.5.Я недавно отредактировал свою модель, чтобы удалить некоторые столбцы и добавить другие ...

class MainSiteStatByHour(models.Model):
    total_score = models.DecimalField(default=0, max_digits=12, decimal_places=2)
    num_articles = models.IntegerField(default=0)
    hour_of_day = IntegerField(
        null=True,
        validators=[
            MaxValueValidator(23),
            MinValueValidator(0)
        ]
    )
    index = models.FloatField(default=0)
        ...
    class Meta:
        unique_together = ("hour_of_day",)

Я сгенерировал свою миграцию, и все, казалось, прошло хорошо ...

(venv) localhost:mainsite_project davea$ python manage.py makemigrations mainsite
Did you rename mainsitestatbyhour.elapsed_time_in_seconds to mainsitestatbyhour.index (a FloatField)? [y/N] N
Migrations for 'mainsite':
  mainsite/migrations/0019_auto_20190401_2139.py
    - Add field index to mainsitestatbyhour
    - Remove field elapsed_time_in_seconds from mainsitestatbyhour
    - Remove field website from mainsitestatbyhour
    - Alter unique_together for mainsitestatbyhour (1 constraint(s))

Миграция выглядит следующим образомэто:

# Generated by Django 2.1.4 on 2019-04-01 21:39

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('mainsite', '0018_auto_20190401_1713'),
    ]

    operations = [
        migrations.AddField(
            model_name='mainsitestatbyhour',
            name='index',
            field=models.FloatField(default=0),
        ),
        migrations.RemoveField(
            model_name='mainsitestatbyhour',
            name='elapsed_time_in_seconds',
        ),
        migrations.RemoveField(
            model_name='mainsitestatbyhour',
            name='website',
        ),
        migrations.AlterUniqueTogether(
            name='mainsitestatbyhour',
            unique_together={('hour_of_day',)},
        ),
    ]

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

(venv) localhost:mainsite_project davea$ python manage.py migrate mainsite
Operations to perform:
  Apply all migrations: mainsite
Running migrations:
  Applying mainsite.0019_auto_20190401_2139...Traceback (most recent call last):
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/models/options.py", line 564, in get_field
    return self.fields_map[field_name]
KeyError: 'website'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/core/management/base.py", line 353, in execute
    output = self.handle(*args, **options)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/core/management/base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 203, in handle
    fake_initial=fake_initial,
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/migrations/migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/migrations/operations/models.py", line 514, in database_forwards
    getattr(new_model._meta, self.option_name, set()),
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 356, in alter_unique_together
    self._delete_composed_index(model, fields, {'unique': True}, self.sql_delete_unique)
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 379, in _delete_composed_index
    columns = [model._meta.get_field(field).column for field in fields]
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 379, in <listcomp>
    columns = [model._meta.get_field(field).column for field in fields]
  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/models/options.py", line 566, in get_field
    raise FieldDoesNotExist("%s has no field named '%s'" % (self.object_name, field_name))
django.core.exceptions.FieldDoesNotExist: MainSiteStatByHour has no field named 'website'

Что делатьМне нужно сделать с моим автоматически сгенерированным migratino, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 02 апреля 2019

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

Попробуйте переместиться вверх AlterUniqueTogether в списке Migration.operations файла миграции:

operations = [
    ...
    migrations.AlterUniqueTogether(
        name='mainsitestatbyhour',
        unique_together={('hour_of_day',)},
    ),
    migrations.RemoveField(
        model_name='mainsitestatbyhour',
        name='website',
    ),
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...