带有子应用程序的 Django 应用程序。 app_labels 用于子应用程序和它们之间的外键关系
django app with subapps. app_labels for subapps and foreignkey relations between them
我正在尝试创建一个包含多个子应用程序的 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' 执行等效操作并从 INSTALLED_APPS
中注释掉 'myapp.app2'
然后我就可以运行./manage.py makemigrations myapp.subapp1
成功了。
但是,如果我随后从 INSTALLED_APPS
中取消注释 myapp.subapp2
并将 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
之间的外键关系?
提前致谢。
其实我很久以前就想通了,但我想我不应该让问题无人回答。我并没有最终不得不使用这个——它只是一个让应用程序的一部分成为可选的练习。在可选子应用程序之间使用外键有点做作,我只是想弄清楚如何引用它们。
原来我只是把 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
时,这将同时列出子应用程序,这令人担忧名称为 real 的子应用程序可能会与其他名称发生冲突。例如,我不喜欢 django-mutant
不命名它是 contrib 的东西,所以你最终得到 app_labels 就像 web
、text
,这可能 完全 class 用一些东西代替 mutant_web
,等等
然后当使用外键时,它们将被引用为 myapp_subapp1.Bar
而不是我之前做的 'myapp.subapp1.Bar'
我正在尝试创建一个包含多个子应用程序的 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' 执行等效操作并从 INSTALLED_APPS
然后我就可以运行./manage.py makemigrations myapp.subapp1
成功了。
但是,如果我随后从 INSTALLED_APPS
中取消注释myapp.subapp2
并将 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
之间的外键关系?
提前致谢。
其实我很久以前就想通了,但我想我不应该让问题无人回答。我并没有最终不得不使用这个——它只是一个让应用程序的一部分成为可选的练习。在可选子应用程序之间使用外键有点做作,我只是想弄清楚如何引用它们。
原来我只是把 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
时,这将同时列出子应用程序,这令人担忧名称为 real 的子应用程序可能会与其他名称发生冲突。例如,我不喜欢 django-mutant
不命名它是 contrib 的东西,所以你最终得到 app_labels 就像 web
、text
,这可能 完全 class 用一些东西代替 mutant_web
,等等
然后当使用外键时,它们将被引用为 myapp_subapp1.Bar
而不是我之前做的 'myapp.subapp1.Bar'