2012年2月12日日曜日

djangoのmodels.pyの分割

models.pyを分割してみた。

こんな感じのdjangoアプリがあるとして
+ [app]
    + models.py
    + views.py
    + その他
models.pyの中にはモデルクラスAaaとかBbbとかがあるとする。

こんな感じにしてみた。
+ [app]
    + [models]
        + __init__.py
        + Aaa.py
        + Bbb.py
    + views.py
    + その他

Aaa.py は普通にこんな感じに書くだろうとして、
# -*- coding: UTF-8 -*- 
from django.db import models

class Aaa(models.Model):
    name = models.CharField(max_length=50)

    class Meta(object):
        app_label = 'app'

__init__.pyはこう書けばこれはこれでいいっぽいんだけど
from Aaa import *
from Bbb import *

思いつきの開発中にモデルを色々こねくり回す事を考えると
ソースファイル作ったり消したりした後に
いちいち__init__.pyを直すのも面倒だなーと思い、
何とかならないか色々試行錯誤した挙句…。
__scope = locals()

def __modelLoader():
    import inspect
    import os
    curdir = os.path.dirname(__file__)
    for file in os.listdir(curdir):
        root,ext = os.path.splitext(file)
        if root[0] not in ['_','.'] and ext == ".py":
            obj = __import__(root,globals(),locals())
            for att in dir(obj):
                if att[0] not in ['_']:
                    attobj = getattr(obj,att)
                    if inspect.isclass(attobj):
                        __scope[attobj.__name__] = attobj

__modelLoader()
del __scope

とてもとてもうさんくさい。
配列外のlocals()の戻り配列に追加とか、アリなのか?

とりあえず、動いてはいるっぽい。
新しくCcc.pyを書き足してmanage.py syncdbすると新しくテーブルも作られた。

どう考えても、modelが固まったら普通にimportの列挙に替えるべき…。

0 件のコメント:

コメントを投稿