我为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 :(得分: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):
...