Невозможно импортировать модели из другого приложения в Django
поэтому у меня есть 2 приложения, работающие в одном проекте.
Мои файлы структурированы следующим образом:
/project_codebase
/project
__init.py
settings.py
urls.py
wsgi.py
...
/app1
...
/app2
...
manage.py
Итак, у меня какая-то странная причина имеет другое имя для моего базового каталога (то есть заканчивается кодовой базой). Надеюсь, это не проблема.
В моем settings.py у меня есть следующее:
INSTALLED_APPS = [
...
'app1',
'app2',
]
Хорошо, поэтому в моей models.py(из app2) я могу легко импортировать модели из app1 с помощью from app1.models import *
, однако, когда я использую from app2.models import *
в моих моделях . py (из app1), я получаю ImportError.
Любые решения для этого?
Ответы
Ответ 1
Это может быть связано с проблемами циклического импорта. Чтобы избежать этого, вы должны динамически загружать модель:
Для последних версий django (1.7 +) используйте реестр приложений:
from django.apps import apps
MyModel1 = apps.get_model('app1', 'MyModel1')
Для ранних версий django (< 1.7):
from django.db.models.loading import get_model
MyModel1 = get_model('app1', 'MyModel1')
Примечание 1: Если вы хотите определить отношение ForeignKey, не требуется отдельный оператор импорта. Django коснулся вас:
Если app1
- установленное приложение, вы должны определить отношение ForeignKey следующим образом:
# in app2.py
class MyModel2(models.Model):
mymodel1 = models.ForeignKey('app1.MyModel1')
Примечание 2. get_model
работает только в том случае, если app1
является установленным приложением, а MyModel1
- модель, которую вы хотите импортировать из app1
.
Примечание 3: Попробуйте избежать импорта подстановочных знаков (from ... import *
), поскольку это плохая практика.
Ответ 2
Это определенно круговой импорт.
Но я думаю, что вам нужно использовать модели в качестве аргументов RetationFields (ForeignKey
, ManyToManyField
или OneToOneField
). Поэтому вам нужно пропустить импорт и использовать его так:
# app1/models.py
class Model1(models.Model):
relation_field = models.ForeignKey('app2.Model2')
Из документов:
Если вам нужно создать связь на модели, которая еще не была определена, вы можете использовать имя модели, а не сам объект модели
Чтобы сослаться на модели, определенные в другом приложении, вы можете явно указать модель с полной меткой приложения.
Просто поместите объект str
качестве первого аргумента для полей отношения, которые приводятся к <app_name>.<Model_name>
.
Примечание: лучше избегать импорта всего из модуля (from <module_name> import *
)
Ответ 3
Если вы хотите импортировать только определенный модуль, не используйте import *
.
Потребуется больше времени на загрузку всей вашей библиотеки, а также может повлиять на скорость вашего приложения.
Если вы хотите использовать несколько модулей из своего второго приложения, просто добавьте имя модуля вместо целых библиотек примерно так:
from app2.models import Module1, Module2
или это может быть проблема с циклическим импортом, поскольку другие уточняют.
Спасибо.
Ответ 4
Вам нужно указать имена моделей, которые вы хотите импортировать, для ex from app1.models import ModelName1, ModelName2
.
Ответ 5
Я всегда использую этот код, и он работает:)
from position_app.models import Member
Ответ 6
Убедитесь, что между одним из ваших приложений и одним из модулей, установленных в вашей среде Python, нет конфликта имен. Если вы используете pip, вы можете запустить pip freeze
чтобы увидеть список установленных модулей.
У меня была такая же ошибка, когда одно из моих приложений было названо "упаковка", и был установлен модуль Python для упаковки.
Ответ 7
Я также сталкиваюсь с этой проблемой, когда пытаюсь импортировать свою модель из другого приложения в (django2.2)
Но, наконец, я импортировал и успешно работает.
вот мое два приложения:
INSTALLED_APPS = [
...
'categories',
'videos',
]
и это код для того, как я импортировал его в файл videos/models.py в качестве подключения ForeignKey
from django.db import models
class Videos(models.Model):
categories = models.ForeignKey('categories.Categories', related_name='categories', on_delete=models.CASCADE)
Если вы хотите увидеть мою модель категорий из файла category/models.py, вы можете проверить этот код, в противном случае пренебречь им
from django.db import models
class Categories(models.Model):
category_name = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)