如何验证序列化/反序列化期间至少存在两个字段之一

rit*_*att 3 django validation serialization deserialization django-rest-framework

我正在使用 Django Rest Framework 并定义我的 Serializer 类。Serializer 类正在验证的输入包含两个字段,如下所示:

"absolute_date_range":{
  "start":...,
  "end":...,
}

"relative_date_range"="last_7"
Run Code Online (Sandbox Code Playgroud)

用户可以选择传递其中之一或两者。但至少必须存在其中之一。如果不是,那么它应该会导致验证错误。

required=True条件仅适用于单个字段。如果我使用自定义逻辑执行此操作,那么将此逻辑放入序列化程序或自定义字段字段级验证中的最佳位置是哪个?

如何在我的序列化器中强制执行此操作?

par*_*han 7

class YourSerializer(serializers.Serializer)
    start = serializers.DateTimeField()
    finish = serializers.DateTimeField()

    def validate(self, data):
        """
        Validation of start and end date.
        """
        start_date = data['start']
        end_date = data['finish']
        if not start_date and not end_date:
            raise serializers.ValidationError("at least one date input required.")
        if other logic:
            other logic stuff
        return data
Run Code Online (Sandbox Code Playgroud)

这对您来说是更好的解决方案


小智 5

IMO这是一个更好的解决方案:

class YourSerializer(serializers.Serializer)
    start = serializers.DateTimeField(required=False)
    end = serializers.DateTimeField(required=False)

    def validate(self, data):
        """
        Validation of start and end date.
        """
        start_date = data.get('start', None)
        end_date = data.get('end', None)
        if not start_date and not end_date:
            raise serializers.ValidationError("at least one date input required.")
        if other logic:
            other logic stuff
        return data
Run Code Online (Sandbox Code Playgroud)

应将开始日期和结束日期设置为,required=False因为这两个日期都不是必需的。之后,在validate()函数中,您应该使用.get()函数获取值,以防止KeyError()由于缺少键而引发。