models.py を複数のファイルに分割する 質問する

models.py を複数のファイルに分割する 質問する

models.pyアプリを複数のファイルに分割しようとしています:

私の最初の推測はこうでした:

myproject/
    settings.py
    manage.py
    urls.py
    __init__.py
    app1/
        views.py
        __init__.py
        models/
            __init__.py
            model1.py
            model2.py
    app2/
        views.py
        __init__.py
        models/
            __init__.py
            model3.py
            model4.py

これは機能しません、そして私は見つけましたこれしかし、この解決策ではまだ問題があり、実行するとpython manage.py sqlall app1次のような結果になります。

BEGIN;
CREATE TABLE "product_product" (
    "id" serial NOT NULL PRIMARY KEY,
    "store_id" integer NOT NULL
)
;
-- The following references should be added but depend on non-existent tables:
-- ALTER TABLE "product_product" ADD CONSTRAINT "store_id_refs_id_3e117eef" FOREIGN KEY     ("store_id") REFERENCES "store_store" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "product_product_store_id" ON "product_product" ("store_id");
COMMIT;

これについてはよく分かりませんが、その部分が心配ですThe following references should be added but depend on non-existent tables:

これは私の model1.py ファイルです:

from django.db import models

class Store(models.Model):
    class Meta:
        app_label = "store"

これは私の model3.py ファイルです:

from django.db import models

from store.models import Store

class Product(models.Model):
    store = models.ForeignKey(Store)
    class Meta:
        app_label = "product"

どうやら動作するようですが、コメントを入力してalter tableこれを試してみると、同じことが起こります:

class Product(models.Model):
    store = models.ForeignKey('store.Store')
    class Meta:
        app_label = "product"

では、参照用の変更を手動で実行する必要がありますか? これにより、南で問題が発生する可能性がありますか?

ベストアンサー1

Django 1.9 を使用している場合は、クラス メタデータを定義せずにフレームワークによってサポートされるようになりました。

https://docs.djangoproject.com/en/1.9/topics/db/models/#パッケージ内のモデルの整理

注記:Django 2の場合、それはまだ同じです

このmanage.py startappコマンドは、models.py ファイルを含むアプリケーション構造を作成します。モデルが多数ある場合は、それらを別々のファイルに整理すると便利です。

これを行うには、モデル パッケージを作成します。models.py を削除し、ファイルとモデルを保存するためのファイルmyapp/models/を含むディレクトリを作成します。ファイル内のモデルをインポートする必要があります。__init__.py__init__.py

つまり、あなたの場合、次のような構造の場合

app1/
    views.py
    __init__.py
    models/
        __init__.py
        model1.py
        model2.py
app2/
    views.py
    __init__.py
    models/
        __init__.py
        model3.py
        model4.py

必要なのは

#myproject/app1/models/__init__.py:
from .model1 import Model1
from .model2 import Model2

#myproject/app2/models/__init__.py:
from .model3 import Model3
from .model4 import Model4

すべてのクラスをインポートすることに対する注意:

各モデルを使用せずに明示的にインポートすると、from .models import *名前空間が乱雑にならず、コードが読みやすくなり、コード分析ツールが使いやすくなるという利点があります。

おすすめ記事