[英]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
showmigrations 時,這將列出子./manage.py showmigrations
myapp_subapp1
和myapp_subapp2
而不是subapp1
和subapp2
,這是令人擔憂的,因為具有真實名稱的子應用程序可能會與其他內容發生沖突。 例如,我不喜歡django-mutant
如何不命名它是 contrib 的東西,所以你最終得到 app_labels 像web
, text
,它可以完全用一些東西而不是mutant_web
等進行mutant_web
。
然后當使用外鍵時,它們會被引用為myapp_subapp1.Bar
而不是我之前做的 'myapp.subapp1.Bar'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.