在django中使用pre_save时取消保存模型

时间:2014-05-30 07:56:54

标签: python django signals

我有一个模特:

class A(models.Model):
    number = models.IntegerField()

但是当我调用A.save()时,我想确保该数字是素数(或其他条件),或者应该取消保存指令。

那么如何取消pre_save信号接收器中的保存指令呢?

@receiver(pre_save, sender=A)
def save_only_for_prime_number(sender, instance, *args, **kwargs):
    # how can I cancel the save here?

3 个答案:

答案 0 :(得分:17)

请参阅我的另一个答案:https://stackoverflow.com/a/32431937/2544762

这种情况很正常,如果我们只是想阻止保存,则抛出异常:

{{1}}

答案 1 :(得分:8)

我不确定您是否只能使用pre_save信号取消保存。但您可以通过覆盖保存方法轻松实现此目的:

def save(self):
    if some_condition:
        super(A, self).save()
    else:
       return   # cancel the save

如@Raptor所述,来电者不知道保存是否成功。如果这是您的要求,请查看强制呼叫者处理“非保存”情况的other answer

答案 2 :(得分:3)

如果数据始终来自表单,并且您可以直接测试是否应该进行保存,请通过validator发送。但请注意,验证器不会被调用来自后端的save()调用。如果您希望这些也受到保护,您可以创建自定义字段,例如class PrimeNumberField(models.SmallIntegerField)如果您运行测试并在该自定义字段的to_python() method中引发异常,则会阻止保存。您还可以在字段,表单或overriding any of several other methods上通过Model隐藏特定字段的验证。