1. ホーム
  2. python

[解決済み] models.pyを複数のファイルに分割する

2022-05-13 18:09:42

質問

を分割しようとしています。 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"

では、手動でalter for referencesを実行すればいいのでしょうか? これはsouthの問題をもたらすかもしれませんね?

どのように解決するには?

次のようにします。

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

次に

#myproject/app1/models.py:
    from submodels/model1.py import *
    from submodels/model2.py import *

#myproject/app2/models.py:
    from submodels/model3.py import *
    from submodels/model4.py import *

ただし、特に理由がなければ、model1 と model2 は app1/models.py に、model3 と model4 は app2/models.py に直接記述してください。

---第二部---。

これはapp1/submodels/model1.pyファイルです。

from django.db import models
class Store(models.Model):
    class Meta:
        app_label = "store"

このようにmodel3.pyを修正します。

from django.db import models
from app1.models import Store

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

編集したのは、これがまた誰かのために出てきたときのためです。 django-schedule をチェックすると、まさにこれを行うプロジェクトの例があります。 https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/