AttributeError: объект 'str' не имеет атрибута '_meta' при миграции

Я перенес свою модель Inventory в собственное приложение и сбросил все миграции и базу данных. python manage.py makemigrations не имеет никаких проблем, но я получаю ошибку при миграции. Надеюсь, кто-нибудь сможет указать мне направление, поскольку отслеживание не кажется мне очень полезным для решения проблемы.

* Я удаляю некоторые части кода и трассировки из-за ограничений переполнения стека

Django версии 4.0.2

traceback

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, inventory, item, project_site, requisition, sessions, transfer, users
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  ...
  Applying item.0001_initial... OK
  Applying project_site.0001_initial...Traceback (most recent call last):
  File "C:\Users\Bernard\pelicans\imrs-capstone\imrs\manage.py", line 22, in <module>
    main()
  File "C:\Users\Bernard\pelicans\imrs-capstone\imrs\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\Bernard\pelicans\imrs-capstone\env\lib\site-packages\django\core\management\__init__.py", line 
425, in execute_from_command_line
    utility.execute()
...
  File "C:\Users\Bernard\pelicans\imrs-capstone\env\lib\site-packages\django\db\migrations\operations\models.py", line 92, in database_forwards
    schema_editor.create_model(model)
  File "C:\Users\Bernard\pelicans\imrs-capstone\env\lib\site-packages\django\db\backends\base\schema.py", line 364, in create_model
    if field.remote_field.through._meta.auto_created:
AttributeError: 'str' object has no attribute '_meta'

project_site/0001_initial.py

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('item', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='Cart',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('cartItemCount', models.PositiveIntegerField(default=0)),
            ],
        ),
        migrations.CreateModel(
            name='Site',
            fields=[
                ...
                ('inventory_items', models.ManyToManyField(blank=True, related_name='inventory_items', through='inventory.Inventory', to='item.Item')),
                ('siteCart', models.ManyToManyField(blank=True, related_name='siteCart', through='project_site.Cart', to='item.Item')),
            ],
        ),
    ]

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

Сначала удалите ManyToManyField, ссылающийся на модель в inventory из Site миграции модели

project_site/migrations/0001_initial.py:

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('item', '0001_initial'),
    ]

    operations = [
        ...
        migrations.CreateModel(
            name='Site',
            fields=[
                ...
                # delete this line ('inventory_items', models.ManyToManyField(blank=True, related_name='inventory_items', through='inventory.Inventory', to='item.Item')),
            ],
        ),
    ]

Затем добавьте начальную миграцию project_site в качестве зависимости в начальную миграцию inventory

inventory/migrations/0001_initial.py:

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('item', '0001_initial'),
        ('project_site', '0001_initial'),
    ]

    ...

Затем создайте новую миграцию в project_site, которая добавит ManyToManyField, теперь это должно быть возможно, поскольку сквозная модель уже создана

project_site/migrations/0002_add_m2m.py:

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('project_site', '0001_initial'),
        ('inventory', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='Site',
            name='inventory_items',
            field=models.ManyToManyField(blank=True, related_name='inventory_items', through='inventory.Inventory', to='item.Item')
        )
    ]
Вернуться на верх