Невозможно импортировать модели из другого приложения в 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)