2015-07-03 72 views
2

我有以下方法保存爲Catalog型號:使通用模型保存方法

class Catalog: 
    ... 
    def save(self, *args, **kwargs): 
     if not self.pk: 
      log.error('NOT ALLOWING SAVE OF %s' % self.__class__.__name__) 
     else: 
      super(Catalog, self).save(*args, **kwargs) 

有沒有一種方法,使:

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

更通用的,所以我不必硬編碼Catalog在那裏,我可以使用這個任何模型沒有任何修改?

+0

我不太清楚你想要的使用情況。你是否想要做到這一點,以便你可以複製/粘貼沒有改變任何東西的代碼?因爲從目錄派生的任何東西都可以使用這種保存方法。 – CrazyCasta

+0

@CrazyCasta這是正確的 - 所以我可以複製/粘貼代碼而不做任何更改。 – David542

回答

0

您不應該在類之間複製和粘貼代碼。這錯過了不要重複自己(DRY)的重要原則的全部觀點。

取而代之,請將此方法放在單獨的類上,您可以將其用作混合類。

class SavePrevented(object): 
    ... 
    def save(self, *args, **kwargs): 
     if not self.pk: 
      log.error('NOT ALLOWING SAVE OF %s' % self.__class__.__name__) 
     else: 
      super(SavePrevented, self).save(*args, **kwargs) 

,並使用它時,你定義任何其他型號:

class Catalog(SavePrevented, models.Model): 
    ... 
+0

它應該是'SavePrevented'在'class Catalog'中。 –

2

一種選擇是創建一個pre_save函數,該函數將在任何這些模型上出錯。

from django.db.models.signals import pre_save 
from django.dispatch import receiver 
@receiver(pre_save) 
def refuse_creation(sender, instance, *args, **kwargs): 
    FORBIDDEN_MODELS = ['Table1', 'Table2', ...] 
    cls_name = instance.__class__.__name__ 
    if cls_name in FORBIDDEN_MODELS: 
     if not instance.pk: 
      log.error('REFUSING TO CREATE OBJECT FOR %s' % cls_name) 
      raise