2009-11-20 74 views
5

如果將django模型設爲抽象類,如下所示,是否有方法檢查類以確定它是抽象的?Django - 如何確定模型類是否抽象

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

我希望我可以檢查MyModel.Meta.abstract,但根據Django文檔:

的Django確實讓一個調整到元類的抽象基類的:在安裝之前,元屬性,它設置abstract = False。這意味着抽象基類的孩子不會自動成爲抽象類。

任何想法?謝謝!

+0

閱讀源代碼有什麼問題?它始終可用。 – 2009-11-20 21:03:59

+0

docs中的摘要與派生類'Meta'相關,而不是'base'。 – 2009-11-21 00:18:21

+1

@ S.Lott - 確實,我是RTFM,但未能通過RTFS。公平起見,許多關於S.O.的問題可能通過閱讀來源自我回答。 @Dmitry - 我對你的評論有點困惑。從django/db/basy.py中可以看出,Meta類中的所有屬性都被轉移到了一個被引用爲_meta的新類。正是這個類保存了模型元類中的原始抽象值。 無論如何,@sheats回答了我的問題(再次感謝)。 – Nagyman 2009-11-23 19:14:37

回答

12

您可以實例化MyModel,然後檢查._meta.abstract。

代碼

所以:

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

我沒有發現在目錄(MyModel)中,但它在那裏。非常感謝。 – Nagyman 2009-11-20 20:14:03

+1

如果您還沒有看過iPython,我會強烈建議使用它。由於它提供了自動完成功能,因此可以四處玩耍並找出這些東西。這就是我如何找到這一個=) – sheats 2009-11-20 22:22:14

+0

在Python中從外部訪問受保護成員是否正常? – sergzach 2012-04-11 15:34:54

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