首页 > 解决方案 > Django 模型条件验证

问题描述

我已经制作了一个 API,客户通过发布请求发送他/她的付款详细信息,因此需要在模型级别验证此数据,我如何通过将模型字段与其他模型字段进行比较来验证模型字段例如:

models.py
Orders(models.Model):
   amount = models.DecimalField(max_digits=19, decimal_places=4)
   currency = models.CharField(max_length=3,choices=[('INR','INR')]) more choices are to be added 
   payee_pan = models.CharField(max_length=10)

需要验证:如果货币为“印度卢比”且金额大于 50000,则必须存在 payee_pan。为了验证它,我在将模型对象保存在 views.py 时使用 model.full_clean()

views.py
    try:
        orders.full_clean()
    except ValidationError:
        return Response({"Error message":"invalid request body"})
    else:
        orders.save()

如果有人在这方面帮助我,我将不胜感激,因为我在这一点上停留了这么久。enter code here

标签: pythondjangoapivalidationmodel

解决方案


您可以通过覆盖clean模型上的方法来执行此类验证(参考验证对象 [Django docs]):

from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _


class Orders(models.Model):
    amount = models.DecimalField(max_digits=19, decimal_places=4)
    currency = models.CharField(max_length=3,choices=[('INR','INR')])
    payee_pan = models.CharField(max_length=10)
    
    def clean(self):
        if self.currency == 'INR' and self.amount > 50000 and not self.payee_pan:
            raise ValidationError(_('Payee Pan is required'))

注意:理想情况下,模型名称应该是单数的(如果您检查模型的详细名称复数,它会以当前Orderss 的额外名称结束s)。因此它应该Order 代替Orders.


推荐阅读