如何验证序列化/反序列化过程中至少存在两个字段之一

时间:2019-03-11 18:18:24

标签: django validation serialization django-rest-framework deserialization

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

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

"relative_date_range"="last_7"

用户可以选择传递其中一项或两项。但是必须至少存在其中一项。如果没有,则应该导致验证错误。

required=True条件仅适用于单个字段。如果我使用自定义逻辑来执行此操作,那是放置此逻辑的最佳位置-串行器或in a Custom FieldField level validation

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

2 个答案:

答案 0 :(得分:2)

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "PostgresConnection": "host=postgres_imdb_id_db; Username=postgres; Port=5432; Database=ImdbIds;"
  }
}

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

答案 1 :(得分:0)

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

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