django应用程序与子应用程序。 app_labels用于子应用程序和它们之间的外键关系

时间:2016-03-24 01:12:26

标签: django namespaces foreign-key-relationship django-apps subapplication

我正在尝试使用多个子应用程序创建一个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的等价物。我担心的是app命名空间冲突。

如果我添加 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.barmyapp.subapp1.Bar之间的外键关系?

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

事实证明我只是在app_label与您放入INSTALLED_APPS

之间的混淆

在这种情况下,我只需将app_labels设置为myapp_subapp1myapp_subapp2,但是,在INSTALLED_APPS中,它们将被安装为myapp.subapp1和{{ 1}}。

当您将myapp.subapp2键入./manage.py showmigrationsmyapp_subapp1而不是myapp_subapp2subapp1时,这将会列出子应用,这会令人担心真正的名称可能会与其他内容冲突。例如,我不喜欢subapp2没有命名它的贡献内容,所以最终会得到像django-mutantweb这样的app_labels,可以完全类,而不是text等等。

然后,当使用外键时,他们会被引用为mutant_web,而不是我以前所做的那样' myapp.subapp1.Bar'