2011-10-27 10 views
6

と私はいくつかのDjangoのモデルを持っているを使用して、私は彼らと一緒に作業を行うためには、Fooの継承すべてのモデルを見つけることができるようにしたいと思い`issubclass()` Djangoのモデル

class Foo(models.Model): 
    class Meta: 
     abstract = True 

class Bar(Foo) 
    pass 

を言います。それは

from django.db import models 
from myapp.models import Foo 

for model in models.get_models(): 
    if issubclass(model, Foo): 
     do_something() 

ああ、これはおそらくモデルを初期化Djangoのメタクラスの内部の作業の結果として、issubclass(Bar, Foo)レポートFalseいるため、動作しないように、簡単にする必要があります。

Djangoモデルが抽象的なDjangoモデルの子孫であるかどうかを確認する方法はありますか?

解決策としてダックタイピングを提案しないでください。この場合、私は本当にサブクラスの関係が存在するかどうかを知りたいと思います。

+0

私は同じ質問をしています... 多くのテストとコードイントロスペクションの後、抽象モデルは呼び出し可能であり、sonオブジェクトはこれに適合する属性やメソッドを持っていないため、ニーズ。 – Oleiade

+1

私はvirtualenvで新しいdjangoアプリケーションを作成しました。あなたのコードは動作しています。私の 'do_something()'は単なる 'プリントモデル'であり、動作します。結果:。 あなたの問題は抽象的であると確信していますか? FYI私はdjangoを使っています。1.3.1 –

+1

Django 1.3.1でも私のために働いています。 – Brandon

答えて

0

は多分

subclasses = Foo.__subclasses__() 
for subclass in subclasses: 
    # we need to keep looking for subclasses of the subclasses 
    subclasses += subclass.__subclasses__() 
# sometimes we don't care about abstract classes 
concrete_subclasses = filter(lambda c: not c._meta.abstract, subclasses) 
1

問題のようなものは、あなたがクラスをインポートする方法です。代わりに:

print models.get_models() 
+0

'myapp.models'を使用してインポートすると問題が生じる理由を説明できますか? 私は再利用可能なアプリケーションを書く場合は、プロジェクト名なしでインポートするものを書く必要がありますか、間違っていますか? – zambotn

0

使用

Bar._meta.get_base_chain(Foo) 

from myapp.models import Foo 

使用:Djangoはであなたのモデルをインポートする方法

from myproject.myapp.models import Foo 

が正しい方法であるかを確認するには、あなたが見ることができます

インヘリータを説明するリストを取得するFooBarの間のnceチェーン。