gpt4 book ai didi

python - 如何指示哪个模型的字段引发了 ValidationError?

转载 作者:行者123 更新时间:2023-12-01 00:54:26 27 4
gpt4 key购买 nike

假设我有一个简单的 Django 模型:

class Transaction(models.Model):    
description = models.CharField('description', max_length=150,
validators=[MinLengthValidator(2, 'Description\'s min length is 2'), ])
amount = models.DecimalField('amount', max_digits=10, decimal_places=2,
validators=[MinValueValidator(1, 'Min value is 1'), ])
user = models.ForeignKey(User)

# to trigger model fields' validation
def clean(self, *args, **kwargs):
super(Transaction, self).clean(*args, **kwargs)

def save(self, *args, **kwargs):
self.full_clean()
super(Transaction, self).save(*args, **kwargs)

我想要一个单元测试,它精确检查 ValidationError 是否由 description 字段引发,而不是由 amount 字段引发(或任何其他)。

所以我有这个测试,它以一种原始的方式检查description字段是否存在于e.exception中:

def test_model_requires_description_min_2_characters(self):
with self.assertRaises(ValidationError) as e:
Transaction.objects.create(description='a', amount="50", user=self.user1)
err_dict = eval(str(e.exception))
self.assertIn('description', err_dict.keys())

但我不太喜欢使用eval(),并且我相信有更优雅的方式来指示ValidationError的来源。我怎样才能做到这一点?

编辑:我的模型类还包括重写的 clean()save() 方法,因此验证器运行良好。

最佳答案

我会做这样的事情,ValidationError有一个属性error_dict,我们已经可以用它来测试这个

def test_model_requires_description_min_2_characters(self):
try:
Transaction.objects.create(description='a', amount="50", user=self.user1)
except ValidationError as e:
# A ValidationError was raised, now we test to see if our field is in it
self.assertIn('description', e.error_dict.keys())
else:
# No exception was raised, raise our own exception
raise Exception('The test failed')

关于python - 如何指示哪个模型的字段引发了 ValidationError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56331987/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com