Django 如何验证在序列化/反序列化期间是否至少存在两个字段中的一个
我正在使用Django Rest框架并定义我的序列化程序类。 序列化程序类正在验证的输入包含如下两个字段: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条件仅适用于单个字段。如果我使用自定义逻辑执行此操作,那么将此逻辑放在序列化程序还是 如何在序列化程序中
"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方法中编写逻辑。