2009年11月19日木曜日

Djangoでmodels.pyを分割する

Djangoでは、アプリケーションのモデルをmodels.pyにclassとして定義するけど、
1つのファイルに定義するにはあまりにも大きくなりすぎたので、分割しようと思った。

いろいろ調べたところ、次の方法で実現できた。

最初は次のような構成になっている。

- project
- app
- models.py
- views.py


このmodels.pyに、demo1クラスとdemo2クラスがあるとすると、
次のようにして分割することができた。

- project
- app
- modelsディレクトリ
- __init__.py
- model1.py
- model2.py
- views.py


model1.pyに含まれるdemo1クラスは次のようにMetaクラスを定義し、app_labelに「app」の名前を定義する。

from django.db import models
class demo1(Models.model):
class Meta:
app_label = 'app'

... 通常の定義 ...


model2.pyに含まれるdemo2クラスは、demo1クラスと同じようにMetaクラスの定義とapp_labelの設定を行う。


from django.db import models
class demo2(Models.model):
class Meta:
app_label = 'app'

... 通常の定義 ...


最後にapp/models/__init__.py に、次の設定を追加する。

from model1 import demo1
from model2 import demo2


これで、manage.py syncdbしたときに、それぞれのモデルのテーブルが作成される。
注意点としては、ForeignKey()を利用するときには、対象のクラスを忘れないようにimportしないといけない。importを忘れると、syncdbしたときにエラーにならないけど、テーブルは作成されていない。



0 件のコメント:

コメントを投稿