こんな感じの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 件のコメント:
コメントを投稿