Джанго приложение с подпапками. app_labels для подпапок и отношений между ними
Я пытаюсь создать приложение Django с несколькими подпапками. Мой текущий макет каталога для приложения (для краткости отфильтрованы admin.py, test.py и views.py):
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?
Но я могу бежать ./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
?
Заранее спасибо.
1 ответ
Я на самом деле понял это давно, но, полагаю, не стоит оставлять вопрос без ответа. Я не заканчивал тем, что использовал это - это было просто упражнение, чтобы сделать часть приложения необязательной. Наличие внешнего ключа между необязательными подпапками было немного надуманным, я просто пытался выяснить, как ссылаться на них.
Оказалось, я просто запутался между app_label
и что вы положили в INSTALLED_APPS
В этом случае я бы просто установил app_labels на myapp_subapp1
а также myapp_subapp2
однако в INSTALLED_APPS они будут установлены как myapp.subapp1
а также myapp.subapp2
,
Это будет список подпапок при вводе ./manage.py showmigrations
как myapp_subapp1
а также myapp_subapp2
скорее, чем subapp1
а также subapp2
, что беспокоило, так как подпап с реальным именем может конфликтовать с чем-то другим. Например, мне не нравится, как django-mutant
не использует пространство имен, это способ вклада, так что вы получите app_labels вроде web
, text
который мог бы полностью заняться чем-то вместо mutant_web
, так далее.
Тогда при использовании внешних ключей они будут ссылаться как myapp_subapp1.Bar
вместо того, что я делал ранее как "myapp.subapp1.Bar"