在DRF中动态设置必填或非必填字段

时间:2020-05-08 06:38:11

标签: django-rest-framework

例如,我有以下序列化器:

class MySerializer(serializers.ModelSerializer):
    field1 = serializers.CharField(required=True)
    field2 = serializers.CharField(required=True)
    field3 = serializers.CharField(required=True)

    field4 = serializers.CharField(required=False)
    field5 = serializers.CharField(required=False)

前3个字段为必填字段,但后2个字段为必填字段。 如果原始数据中仅存在3个必需字段,但是一旦 field4 field5 出现,我该怎么办原始数据,我希望所有required=False的字段都变为required=True,也就是说,如果我输入任何非必填字段,则所有其他非必填字段将变为必填字段。

换句话说,我以可以输入零个不需要的字段或全部输入的方式对其进行调整。

谢谢。

1 个答案:

答案 0 :(得分:0)

我创建了以下mixin来解决此问题:

class RequiredTogetherFieldsMixin:
    """
    Allow to specify few fields as required together. They are not required until at leas one field from
    this set is filled with data. That would trigger all other fields specified in 'required_together_fields'
    became required. That is ine can leave all required together fields empty or fill tem all.
    """
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        if not self.fields.keys() >= set(self.required_together_fields):
            raise serializers.ValidationError(
                {'required_together_fields': error_codes.REQUIRED_TOGETHER_WRONG_FIELDS_NAMES},
                code='wrong_required_together_fields'
            )

        required_fields_in_data = set(self.required_together_fields).intersection(self.initial_data)

        if required_fields_in_data:
            for field_name, field in self.fields.items():
                if field_name in self.required_together_fields:
                    field.required = True

    required_together_fields = ()

您需要做的就是在序列化程序中指定required_together_fields并从此cource mixin继承。 至少,其中一个字段随数据一起提交了,其他所有字段也将变成required