我有一个模特:
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?
答案 0 :(得分:17)
答案 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隐藏特定字段的验证。