基于另一个模型的字段值的Django模型验证

基于另一个模型的字段值的Django模型验证,django,django-models,django-signals,django-validation,Django,Django Models,Django Signals,Django Validation,我有这个Django模型: from accounts.models import Account
 class BankOperation(models.Model):
 created_at = models.DateTimeField(auto_now_add=True) account = models.ForeignKey(Account, on_delete=models.CASCADE) operation_im

我有这个Django模型:

   from accounts.models import Account
   

   class BankOperation(models.Model):
    
       created_at = models.DateTimeField(auto_now_add=True)
       account = models.ForeignKey(Account, on_delete=models.CASCADE)
       operation_import = models.FloatField(default=0.0)
    
    
我想确保导入的
操作
不高于
账户余额
官方的做法是什么?我已经看到一些关于重写save()方法的答案,但其他人建议不要这样做

我应该添加一个预保存信号并抛出某种异常吗

有没有办法创建一个接受参数的字段验证器? 所以可能是这样的:

   def validate_bank_operation_import(value, account_balance):

   if value > account_balance:

        raise ValidationError("Bank operation import is higher than account balance!")
在我的模型中,我将字段更改为:

operation_import = models.FloatField(default=0.0, validators=[validate_bank_operation_import])
但是我可以将参数传递给验证器吗?如果是,我该怎么做


也许还有另外一种方法可以进行验证

文档中详细描述了验证过程,包括使用此方法实现自定义验证。由于它是一种绑定方法,因此它可以访问
self
,然后访问
self.account.balance

,文档中详细描述了验证过程,其中包括使用此方法实现自定义验证。因为它是一个绑定方法,所以它可以访问
self
,然后访问
self.account.balance

谢谢!我以为答案会覆盖一个方法,但我自己找不到。您能告诉我应该在哪里调用clean()方法吗?在文档中,它说:但是,请注意,与Model.full_clean()类似,在调用模型的save()方法时,不会调用模型的clean()方法。这样重写save()方法是一种好做法:我应该调用full_clean()还是直接调用clean()
defsave(self,*args,**kwargs):self.full_clean()返回super(BankOperation,self).save(*args,**kwargs)
显然它甚至可以在不调用save()方法的情况下工作。现在重写clean()方法似乎还可以。感谢您的回答我想不出在任何情况下,重写一个方法并返回调用其超类的结果,与直接调用未重写的方法之前从外部对对象实例执行相同的操作是不同的。(您真的应该读一下),“当您使用ModelForm时,对is_valid()的调用将对表单中包含的所有字段执行这些验证步骤”谢谢!我以为答案会覆盖一个方法,但我自己找不到。您能告诉我应该在哪里调用clean()方法吗?在文档中,它说:但是,请注意,与Model.full_clean()类似,在调用模型的save()方法时,不会调用模型的clean()方法。这样重写save()方法是一种好做法:我应该调用full_clean()还是直接调用clean()
defsave(self,*args,**kwargs):self.full_clean()返回super(BankOperation,self).save(*args,**kwargs)
显然它甚至可以在不调用save()方法的情况下工作。现在重写clean()方法似乎还可以。感谢您的回答我想不出在任何情况下,重写一个方法并返回调用其超类的结果,与直接调用未重写的方法之前从外部对对象实例执行相同的操作是不同的。(你真的应该读一下),“当你使用一个ModelForm时,对is_valid()的调用将对表单“我不知道是谁”中包含的所有字段执行这些验证步骤,建议“不要重写
Model.save()
,但这是完整的BS。甚至:“如果你想要定制的保存行为,你可以重写这个save()方法。”我不知道是谁“建议”不要重写
Model.save()
,但那完全是废话。甚至:“如果需要自定义保存行为,可以重写此save()方法”