Django休息框架有条件地需要字段

时间:2017-12-28 14:33:46

标签: python django django-rest-framework

我想写一个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'没有设定。任何线索?

2 个答案:

答案 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请求)-必填字段“注释”)