关于 django:模型验证:我可以访问 ValidationError 代码吗?

Model validation: can I access ValidationError code?

我有两个直接相关的问题。

Django 文档建议使用以下代码引发 ValidationError:

1
2
3
4
5
# Good
ValidationError(_('Invalid value'), code='invalid')

# Bad
ValidationError(_('Invalid value'))

如何在测试中访问此代码?我对捕获的异常使用 as_dataas_json 或简单的 .code 的所有尝试都失败了。不幸的是,我看到的所有建议都与表单验证有关。我的测试验证了模型。

这和之前问的问题几乎一样(我不使用表格)。

相关问题:上面链接的同一个文档页面给出了一些如何引发 ValidationError 的示例,虽然 "Raising ValidationError" 部分建议使用该代码,"在实践中使用验证" 再也没有提到它,和那里的例子不使用代码。我想知道这是否表明此功能已过时。


我学会了如何在 PyCharm 中调试 Django 测试,它帮助我找到了解决方案。为他人着想:

错误代码可通过 exception.error_dict[field_name][err_no].code 访问。例如,以下检查引发了非常具体的错误:

1
2
3
4
5
6
7
8
9
10
def test_negative_photo_number(self):
   """Cannot create photo with negative photo number"""
    with self.assertRaises(ValidationError) as ve_context:
        self.create_photo(album_number=1, photo_number=-2)

    e = ve_context.exception
    print(e.error_dict)
    self.assertEqual(len(e.error_dict.keys()), 1, 'Encountered more than one problematic field')
    self.assertEqual(len(e.error_dict['number']), 1, 'Encountered more than one error')
    self.assertEqual(e.error_dict['number'][0].code, 'min_value')

对于在字段验证器之外引发的 ValidationError(例如通过 model.clean 方法),将字段名称(上面的"数字")替换为 __all__.