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')
)
]