2010-11-11 33 views
2

我有一個抽象類,它具有用於我所有模型的一些常用方法。我在所有模型中都繼承了這個類。現在需要在模型刪除時發送郵件。所以我重寫了抽象類中的delete()方法。這導致相同方法的遞歸調用,因爲調用super方法。Django - 在基類中覆蓋模型的delete()方法 - 遞歸問題

super(Model, self).save(*args, **kwargs) 

    class Common(models.Model): 
      #mail logic 
      super(type(self), self).delete(*args, **kwargs)   

    class Child(Common)  
      # fields 
+0

最好使用django信號:'post_delete'或'pre_delete'。例如:可以說你的'Child'類具有:'Child.parent = ForeignKey(Parent)'。現在,如果刪除父項:'parent.delete()',那麼您的子項也將被刪除(級聯刪除行爲)。發生這種情況時,不會在Child對象上調用delete()方法,並且不會執行您的#mail邏輯。如果您要使用信號,一切都按預期工作。閱讀如何使用它們:http://docs.djangoproject.com/en/dev/topics/signals/ – Ski 2010-11-11 17:00:34

+0

@Skirmantas這是個好主意。非常感謝。 – 2010-11-11 17:52:14

回答

4

這就是爲什麼您必須始終使用正確的類型而不是type(self)

super(Common, self).delete(*args, **kwargs) 
+1

你是對的。但是,由於此方法在公共基類中以避免重複代碼。所以,我們不會知道模型類型。還有其他選擇嗎? – 2010-11-11 15:19:56

+2

您不需要模型類型,您需要當前類。當前課程是'Common'。 – 2010-11-11 15:21:31

+0

完美。有用。非常感謝。我對你的反應速度感到驚訝。 – 2010-11-11 15:25:22