提问人:TabulaRasa 提问时间:7/3/2023 更新时间:7/3/2023 访问量:36
如何序列化对象列表并在验证后返回对象?
How can I serialize a list of objects and return the object if validated?
问:
我的一个视图集类中有以下内容:
serializer = ResponsesSerializer(data=queryset, many=True)
serializer.is_valid(raise_exception=True)
validated_data = serializer.validated_data
response = Response(validated_data, status=status.HTTP_200_OK)
return response
出于测试目的,是传递给 my 的对象列表,其中只有第一个对象具有键:queryset
ResponsesSerializer
record
queryset = [
{
"C_Ethnicity.r1": 0,
"C_Ethnicity.r2": 0,
"EaseOfFind.r1": 0,
"EaseOfFind.r2": 1,
"Leg.r1": 0,
"Leg.r2": 0,
"record": 17
},
{
"C_Ethnicity.r1": 0,
"C_Ethnicity.r2": 0,
"EaseOfFind.r1": 0,
"EaseOfFind.r2": 1,
"Leg.r1": 1,
"Leg.r2": 0,
},
{
"C_Ethnicity.r1": 0,
"C_Ethnicity.r2": 0,
"EaseOfFind.r1": 0,
"EaseOfFind.r2": 1,
"Leg.r1": 1,
"Leg.r2": 0,
}
]
在响应中,序列化程序预期会为没有键的最后两个对象引发验证错误,但我不知道为什么第一个对象是空的:record
[
{},
{
"non_field_errors": [
"Missing 'record' key in dictionary."
]
},
{
"non_field_errors": [
"Missing 'record' key in dictionary."
]
}
]
这是:ResponsesSerializer
class ResponsesSerializer(serializers.Serializer):
def to_internal_value(self, data):
return data
def validate(self, data):
if 'record' not in data:
raise serializers.ValidationError("Missing 'record' key in dictionary.")
return data
我是序列化程序的新手,在这种情况下,我只想添加可以测试列表中每个对象的验证条件,即具有键或一定长度的项目,并忽略任何其他键。record
答:
0赞
willeM_ Van Onsem
7/3/2023
#1
但我不知道为什么第一个对象是空的。
序列化程序验证列表中的所有元素,并且仅在所有项都有效的情况下才有效。
如果一个或多个项目无效,则返回错误。它通过字典列表来实现这一点,对于给定数据中的每个项目,它在错误列表中都有一个项目。这是有道理的,因为人们可能想知道哪个项目适用错误。因此,第一个字典包含第一项的错误。
由于第一项不包含错误,因此它是一个空字典,这意味着第一项有效,但其余部分无效。
只有当所有项目都匹配时才插入数据可能很有意义,因为人们通常希望操作是原子性的:要么全部成功(一起),要么根本没有成功。
我只想添加可以测试列表中每个对象的验证条件,即具有记录键或一定长度的项目。
通常你不会自己实现。将字段添加到序列化程序,例如:validate
class ResponsesSerializer(serializers.Serializer):
record = serializer.CharField(required=True)
然后,这将检查是否确实存在字符串字段。record
或一定长度的项目。
在这种情况下,您可以使用 ,这本质上就是 a 的作用。您可以使用以下方法轻松构建它:ListSerializer
many=True
serializer = ResponsesSerializer(many=True, min_length=5, max_length=5)
这将要求请求中正好有五个项目。
评论