带有子应用程序的 Django 应用程序。 app_labels 用于子应用程序和它们之间的外键关系

标签 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 的等效项成功。我担心的是应用程序命名空间冲突。

如果我添加一个 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成功地。

但是,如果我取消注释 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 ?

提前致谢。

最佳答案

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

原来我只是在 app_label 之间混淆了以及你输入的内容 INSTALLED_APPS
在这种情况下,我只需将 app_labels 设置为 myapp_subapp1myapp_subapp2 ,但是,在 INSTALLED_APPS 中,它们会被安装为 myapp.subapp1myapp.subapp2 .

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

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

关于带有子应用程序的 Django 应用程序。 app_labels 用于子应用程序和它们之间的外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36191583/

相关文章:

python - 使用 CA 发布的数字证书签署 PDF 文档的 Web 应用程序

r - 将临时 namespace 附加到搜索路径

C# - 如何检查 C# 中是否存在命名空间、类或方法?

mysql - 使用整数数组设置外键

java - 获取Key SQLite Android

perl - 如何在运行时使用 DBIx::Class 和 Catalyst 添加关系?

python - 将词典列表打印到模板

Django MultipleObjectsReturned

python - Django 动态访问相关属性?

php - 我应该如何在 PHP 中正确命名我的命名空间?