Django 如何验证在序列化/反序列化期间是否至少存在两个字段中的一个

Django 如何验证在序列化/反序列化期间是否至少存在两个字段中的一个,django,validation,serialization,django-rest-framework,deserialization,Django,Validation,Serialization,Django Rest Framework,Deserialization,我正在使用Django Rest框架并定义我的序列化程序类。 序列化程序类正在验证的输入包含如下两个字段: "absolute_date_range":{ "start":..., "end":..., } "relative_date_range"="last_7" 用户可以选择在中传递其中一个或两个。但至少其中一人必须在场。如果不是,则会导致验证错误 required=True条件仅适用于单个字段。如果我使用自定义逻辑执行此操作,那么将此逻辑放在序列化程序还是 如何在序列化程序中

我正在使用Django Rest框架并定义我的序列化程序类。 序列化程序类正在验证的输入包含如下两个字段:

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

"relative_date_range"="last_7"
用户可以选择在中传递其中一个或两个。但至少其中一人必须在场。如果不是,则会导致验证错误

required=True
条件仅适用于单个字段。如果我使用自定义逻辑执行此操作,那么将此逻辑放在序列化程序还是

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

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
这对你来说是更好的解决方案


这是一个更好的解决方案

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()

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()

如果您有一个带有这些字段的模型,并且一般要求至少有一个字段,然后我会说最好把逻辑放在模型中。这将是枯燥的(不要重复你自己),因为这将避免在几个不同的地方重新实现验证。我认为最好的方法是在序列化器的validate方法中编写逻辑。如果你有一个带有这些字段的模型,一般要求是至少有一个字段,那么我认为最好将逻辑放在模型中。这会很枯燥(不要重复),因为这样可以避免在几个不同的地方重新实现验证。我认为最好的方法是在序列化程序的validate方法中编写逻辑。