2015-10-06 16 views
0

我想使用sender.__class__獲取以下代碼中發件人的類。這有效,直到我有一個從基類繼承的模型。使用Python獲取孩子__class__不是基類

例如發件人是班級檔案,但sender.__class__給出的基本低音檔案繼承自MPTTModelBase(即abstract = True)。與.Meta

@receiver(post_save) 
def send_func(sender, instance, created, **kwargs): 

    print(sender) #<class 'demo.apps.t.models.Profile'> 
    print(sender.__class__) # <class 'mptt.models.MPTTModelBase'> 

同樣的事情,我怎麼類繼承忽略模型(如果有的話)?

+1

'sender' * *是這個信號的類本身。 – spectras

+0

我明白了,所以'sender .__ class__''正在降低另一個級別?但爲什麼如果我做'sender.Meta''它是否得到了MPTTModelBase Meta。它不應該得到發件人嗎? – Prometheus

+1

的確,'sender .__ class__'可以讓你獲得[metaclass](http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python)。一旦加載了類,您將使用'sender._meta'來訪問元選項。 – spectras

回答

1

對於大多數django信號,信號的發送者本身就是類。在這裏,您獲得sender作爲課程,實際對象爲instance

那麼你將得到的是:

  • sender.__class__:模型的metaclass
  • sender._metamodel's Meta選項。你可以在這裏得到它,因爲Django從模型中刪除了Meta,並使得選項可用_meta,它通過一些方法增加了它。
+0

謝謝'sender._meta''幫助我很多。 – Prometheus

+0

是的,對於需要檢查模型的所有類型的通用代碼來說非常方便。如果你使用的版本比1.8版本的Django版本要高,請注意它從django 1.7變成了django 1.8。 – spectras