0

Я пытаюсь создать приложение django с несколькими субаппами. Мой текущий макет каталог для приложения является (отфильтровываются admin.py, test.py и views.py для краткости):django приложение с subapps. app_labels для субпапсов и отношений между ними.

myapp 
    __init__.py 
    models.py 
    subapp1/ 
     __init__.py 
     models.py 
    subapp2 
     __init__.py 
     models.py 

Где MyApp/models.py выглядит следующим образом:

class Foo(models.Model): 
    name = models.CharField(max_length=32) 

и MyApp/subapp1/models.py выглядит следующим образом:

class Bar(models.Model): 
    foo = models.ForeignKey('myapp.Foo') 
    some_other_field = models.CharField(max_length=32) 

и MyApp/subapp2/models.py выглядит как:

class Baz(models.Model): 
    bar = models.ForeignKey('subapp1.Bar') 

В моей settings.py у меня есть:

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'myapp', 
    'myapp.subapp1', 
    'myapp.subapp2' 
) 

Однако, когда я пытаюсь запустить ./manage.py makemigrations myapp.subapp1 я получаю ошибку:

App 'myapp.subapp1' could not be found. Is it in INSTALLED_APPS?

Но I am может успешно выполнить ./manage.py makemigrations subapp1 и эквивалент для subapp2. Я беспокоюсь о конфликтах пространства имен приложений.

Если я добавить MyApp/subapp1/apps.py

from django.apps import AppConfig 

class SubApp1Config(AppConfig): 
    name = 'myapp.subapp1' 
    label = 'myapp.subapp1' 

, а затем MyApp/subapp1/__ init__.py

default_app_config = 'myapp.subapp1.apps.SubApp1Config' 

ли эквивалент для «MyApp/subapp2 'и закомментировать «myapp.app2» от INSTALLED_APPS

Затем я могу запустить ./manage.py makemigrations myapp.subapp1 успешно.

Однако если бы я тогда раскомментируйте myapp.subapp2 от INSTALLED_APPS

и изменить MyApp/subapp2/models.py выглядеть следующим образом:

class Baz(models.Model): 
    bar = models.ForeignKey('myapp.subapp1.Bar') 

, а затем запустить ./manage.py makemigrations myapp.subapp2 я получаю:

SystemCheckError: System check identified some issues: 

ERRORS: 
myapp.subapp2.Baz.bar: (fields.E300) Field defines a relation with model 'myapp.subapp1.Bar', which is either not installed, or is abstract. 

Как я могу описать отношение внешних ключей между myapp.subapp2.Baz.bar и myapp.subapp1.Bar?

Заранее спасибо.

ответ

0

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

Оказалось, что я был просто запутался между app_label и то, что вы положили в INSTALLED_APPS

В этом случае я бы просто установить app_labels на myapp_subapp1 и myapp_subapp2, однако, в INSTALLED_APPS, они будут установлены как myapp.subapp1 и myapp.subapp2.

Это как список subapps при вводе ./manage.py showmigrations в myapp_subapp1 и myapp_subapp2, а не subapp1 и subapp2, которая волновалась как SubApp с реальной имя может столкнуться с чем-то другим. Например, мне не нравится, как django-mutant не пространство имен это вно материал, так что вы в конечном итоге с app_labels как web, text, которые могли бы совершенно класс с чем-то вместо mutant_web и т.д.

Тогда при использовании внешние ключи, на которые они ссылались бы как myapp_subapp1.Bar вместо того, что я делал ранее, как «myapp.subapp1.Bar»

 Смежные вопросы

  • Нет связанных вопросов^_^