簡體   English   中英

帶有子應用程序的 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.barmyapp.subapp1.Bar之間的外鍵關系?

提前致謝。

我其實很久以前就想到了這一點,但我想我不應該讓一個問題懸而未決。 我最終不必使用它 - 它只是使應用程序的一部分成為可選的練習。 在可選的子應用程序之間使用外鍵有點做作,我只是想弄清楚如何引用它們。

原來我只是在app_label和你放在INSTALLED_APPS內容之間感到困惑

在這種情況下,我只需將 app_labels 設置為myapp_subapp1myapp_subapp2 ,但是,在 INSTALLED_APPS 中,它們將作為myapp.subapp1myapp.subapp2安裝。

當您鍵入./manage.py showmigrations showmigrations 時,這將列出子./manage.py showmigrations myapp_subapp1myapp_subapp2而不是subapp1subapp2 ,這是令人擔憂的,因為具有真實名稱的子應用程序可能會與其他內容發生沖突。 例如,我不喜歡django-mutant如何不命名它是 contrib 的東西,所以你最終得到 app_labels 像webtext ,它可以完全用一些東西而不是mutant_web等進行mutant_web

然后當使用外鍵時,它們會被引用為myapp_subapp1.Bar而不是我之前做的 'myapp.subapp1.Bar'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM