2009-11-20 17 views
5

以下のように、ジャンゴモデルが抽象化されている場合、クラスを調べて抽象クラスであるかどうかを調べる方法はありますか?Django - モデルクラスが抽象であるかどうかを判断する方法

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

私はMyModel.Meta.abstractを調べることができることを期待していますが、Djangoのドキュメントによるとなります

Djangoは抽象ベースクラスのメタクラスに一度の調整を行うことが行われます。インストールする前に、メタ属性、は、抽象的な=偽を設定します。つまり、抽象基底クラスの子は自動的に抽象クラスになるわけではありません。

ありがとう!

+0

ソースの読み方には何が問題なのですか?常に利用可能です。 –

+0

docsの要約は派生クラス 'Meta、not base's'に関連しています。 –

+1

@ S.Lott - 確かに、私はRTFMだがRTFSには失敗した。公平になるためには、S.O.おそらくソースを読んで自己回答になるかもしれない。 @ドミトリー - あなたのご意見が少し混乱しています。 django/db/basy.pyから、Metaクラスのすべての属性が_metaとして参照される新しいクラスに転送されるように見えます。モデルのメタクラスに設定されている元の抽象的な値を保持するのはこのクラスです。 @sheatsは私の質問に答えました(もう一度ありがとう)。 – Nagyman

答えて

12

MyModelをインスタンス化してから._meta.abstractをチェックすることができます。コード中のSO

m = MyModel() 
print m._meta.abstract 
+0

私はdir(MyModel)でそれを見つけませんでしたが、そこにあります。どうもありがとう。 – Nagyman

+1

iPythonを調べていないのであれば、私は強く勧めます。オートコンプリートを提供しているので、遊んでこれらのことを見つけることは非常に便利です。これで私はこれを見つけたのです=) – sheats

+0

Pythonで外部から保護されたメンバーにアクセスするのは普通ですか? – sergzach

1

私はあなたはそれが抽象的だかどうかを確認するためにモデルをインスタンス化する必要がないことを指摘したいのですが - Djangoのモデルは、クラスのインスタンス化に_metaを追加し、実際のメタクラスを継承。

ので、同様にsheatsのコードを@に、

from django.db.models import Model 
class MyModel(Model): 
    pass 
print MyModel._meta.abstract 

あるいは、もちろん正例えば

from django.db.models import Model 
class MyModel(Model): 
    class Meta(object): 
    abstract = True 
print MyModel._meta.abstract 

を試してみてください、これはまた、内蔵のモデルとDjangoのモデルから継承する何のために働きます。

from django.contrib.auth.models import User 
print User._meta.abstract 
関連する問題