Django REST框架:validate_ <fieldname>和validate之间的区别是什么?

Nei*_*eil 6 validation django-rest-framework

我在我的序列化程序中执行自定义字段级验证,需要引用另一个字段.

查看验证文档中的示例,我不清楚是否应该使用validate_<fieldname>validate.它看起来都有attrs字典,所以从validate_<fieldname>我可以很容易地引用另一个字段作为validate(即使描述,validate表明你应该使用它来访问多个字段).那么为什么有这两种选择呢?在我的情况下,哪个选项使用正确?

Tom*_*tie 17

提升ValidationError内部validate_<foo>()将导致字段错误.

{'foo': ['Not a fooish value.']}
Run Code Online (Sandbox Code Playgroud)

提升ValidationError内部validate()将导致非字段错误.

{'non_field_errors': ['Foo and bar are not compatible.']}
Run Code Online (Sandbox Code Playgroud)

那么为什么有这两种选择呢?

部分是因为上述原因,部分是因为序列化程序API在可能的情况下镜像了Django的表单API.在需要的地方有一些差异,但风格validatevalidate_<foo>风格相似.

在我的情况下,哪个选项使用正确?

根据哪个错误消息更合适,您可以进行判断调用.

  • `self.context`是序列化程序的任何额外上下文的字典.通用视图将填充`request`,因此您可以使用`self.context ['request'].user`.提及[这里](http://django-rest-framework.org/api-guide/serializers.html#including-extra-context)但我认为可能需要更加突出和/或进一步解释. (3认同)
  • Neil - `attrs`是序列化程序在被验证并恢复为完全成熟的对象实例之前作为字典的输入.在我的脑海中,我想这可能与您访问它时已经验证的一些输入有关. (2认同)