python - 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
解决方案
您可以通过覆盖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
推荐阅读
- sql - 在 postgresql 中通过简单查询获得比预期更多的记录
- json - 如何逐行读取文件,然后在jq中输出所有与sth复合的行?
- swagger - 在 OpenAPI 3 中将参数传递给“$ref”
- xcode - 如何在 Xcode 错误中解决这个问题:没有这样的文件或目录:fishhook.c?
- java - 我的消费者能否在少数情况下(显然)成为生产者
- javascript - 如何配置 vue apollo InMemoryCache
- scala - Scala 宏类型检查如何将标识符解析为类型?
- sql-server - T-SQL 渐变维度 - 多次更新,单次操作输出?
- c - 查找最大数的索引
- javascript - 如何修复 MongoDB 连接上的“MongoParseError: Multiple text records not allowed at ...”