避免在pre_save信号中保存实例而不使用raise Exception

时间:2016-07-08 05:13:26

标签: django python-2.7 django-models django-signals

我有两个模型。当我从第一个实例保存实例时,我需要将此模型中的字段值发送到另一个字段中。

第一个模型:

class ModelOne(models.Model):
    # fields...
    quantity = models.FloatField()

第二种模式:

class ModelTwo(models.Model):
    # fields...
    quantity = models.FloatField()

pre_save信号:

@receiver(pre_save, sender=ModelOne)
def verify(sender, instance, **kwargs):
    # Stuff
    quantity = instance.quantity
    founded_model_two = ModelTwo.objects.get("""Something""")
    future_result = founded_model_two.quantity - quantity
    if future_result < 0:
        raise Exception("Cannot be less than zero")

我想避免保存实例,但我不想提出异常

1 个答案:

答案 0 :(得分:0)

如果您不想在pre_save中查找异常,可以使用save方法进行操作。因为理想情况下pre_save应抛出异常来阻止信号完成。

class ModelOne(models.Model):
    # fields...
    quantity = models.FloatField()


    def save(self):
        if some_condition:
            super(ModelOne, self).save()
        else:
           return   #cancel the save if you return no super save object.

恕我直言,你不需要做所有这些,可以使用Validators来检查你的数据是否需要保存。如果您有form保存数据,请使用表单验证来停止保存数据。