制作通用模型保存方法

时间:2015-07-03 23:06:57

标签: python django

我为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,我可以将它用于任何模型而不做任何修改?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您不应该在类之间复制和粘贴代码。这忽略了唐不要重复自己(DRY)的重要原则的全部要点。

相反,将它作为一个单独的类,可以用作mixin。

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):
    ...