1

我正在尝试创建一个包含多个子应用的 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 subapp1subapp2 的等效项。我担心的是应用程序命名空间冲突。

如果我添加一个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

提前致谢。

4

1 回答 1

1

实际上我很久以前就想到了这一点,但我想我不应该让一个问题没有答案。我最终不必使用它——它只是使应用程序的一部分成为可选的练习。在可选子应用程序之间有一个外键有点做作,我只是想弄清楚如何引用它们。

原来我只是在你输入的app_label内容和你输入的内容之间感到困惑INSTALLED_APPS

在这种情况下,我只需将 app_labels 设置为myapp_subapp1and myapp_subapp2,但是,在 INSTALLED_APPS 中,它们将安装为myapp.subapp1and myapp.subapp2

当您键入./manage.py showmigrationsasmyapp_subapp1myapp_subapp2而不是subapp1and时,这将列出子应用程序subapp2,这令人担忧,因为具有真实名称的子应用程序可能会与其他内容发生冲突。例如,我不喜欢django-mutant不命名空间它是 contrib 的东西,所以你最终会得到 app_labels 之类web的 , text,它可以完全用一些东西而不是mutant_web, 等等来分类。

然后,当使用外键时,它们会被引用myapp_subapp1.Bar为“myapp.subapp1.Bar”,而不是我之前所做的

于 2016-04-19T10:15:17.040 回答