我想写一个drf validator,根据其他字段的值,根据需要标记字段。 例如:
class MySerializer(serializers.Serializer):
has_children = fields.BooleanField()
nb_childs = fields.IntegerField(min_value=1, validators=[RequiredIf(field='has_children', value=True)], required=False)
起初,我相信class based validator是通过检索' has_children'的价值来实现目标的方法。使用这样的方法:
def set_context(self, serializer_field):
print serializer_field.parent.initial_data
但是" initial_data'没有设定。任何线索?
答案 0 :(得分:4)
看看here in the DRF documentation
基本上,要进行对象级验证,您需要覆盖Serializer的validate(self, data)
方法,使用data
参数的值进行验证(这是{{1}提供的序列化程序状态如果出现任何问题,请提出dict
。
如果您需要针对特定字段引发错误,则可以将字典作为参数传递给ValidationError
构造函数:
ValidationError
答案 1 :(得分:1)
我为此使用了多个混合,它们正在更改字段。必需属性,结果是错误验证消息 由DRF自动生成
PerFieldMixin
var script = document.createElement('script');
script.src = '//code.jquery.com/jquery-1.11.0.min.js';
document.getElementsByTagName('head')[0].appendChild(script);
如何使用PerFieldMixin
class ConditionalRequiredPerFieldMixin:
"""Allows to use serializer methods to allow change field is required or not"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field_name, field in self.fields.items():
method_name = f'is_{field_name}_required'
if hasattr(self, method_name):
field.required = getattr(self, method_name)()
PerActionMixin
class MySerializer(ConditionalRequiredPerFieldMixin, serializers.ModelSerializer):
subject_id = serializers.CharField(max_length=128, min_length=3, required=False)
def is_subject_id_required(self):
study = self.context['study']
return not study.is_community_study
如何使用PerActionMixin
请参阅文档字符串,以获取==更新操作(即PUT请求)-必填字段“注释”)