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?

しかし、subapp2 に相当するものを正常に実行できます。./manage.py makemigrations subapp1私が心配しているのは、アプリの名前空間の衝突です。

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_subapp1myapp_subapp2に設定するだけですが、INSTALLED_APPS では、 と としてインストールされmyapp.subapp1ますmyapp.subapp2

これにより、実際の名前のサブアプリが何か他のものと衝突する可能性があるため心配していたandではなく、andと入力./manage.py showmigrationsすると、両方のサブアプリが一覧表示されます。たとえば、名前空間が contrib のものではないのが好きではないので、 ,のような app_labelsになり、 , などの代わりに何かで完全にクラス化できます.myapp_subapp1myapp_subapp2subapp1subapp2django-mutantwebtextmutant_web

次に、外部キーを使用すると、myapp_subapp1.Bar以前に行っていた「myapp.subapp1.Bar」の代わりに、それらが参照されます

于 2016-04-19T10:15:17.040 に答える