python / django / モジュール内のモデルクラスを探し出す関数

モデルのクラス全部に対して同じような処理をしたいときにモジュール内のモデルクラスをリスト化してくれる関数があると便利。

UPDATE: djangoにそういうメソッドがあった: django.db.models.get_models() (考えてみれば当たり前だよな)

こんな風に使える。


import yoyodyne.models
for cls in model_classes_in_module(yoyodyne.models):
print cls
do_someting_with_a_model_class(cls)


def model_classes_in_module(model_module):
""" モジュール内のモデルクラスを返す """
import django.db.models
return [ v for v in [ getattr(model_module, name)
for name in dir(model_module) ]
if isinstance(v,type) \
and issubclass(v, django.db.models.Model) \
and v.__module__.startswith(model_module.__name__) ]

  • dir()でモジュール内の属性の名前と値をゲット
  • その中からtypeであり、
  • モデルのサブクラスであり、
  • 与えられたモジュール内で定義されているものに絞り込む

モデルクラスを歩くのがdjangoモデルのメタプログラミングの第一歩。