如何序列化对象列表并在验证后返回对象?

How can I serialize a list of objects and return the object if validated?

提问人:TabulaRasa 提问时间:7/3/2023 更新时间:7/3/2023 访问量:36

问:

我的一个视图集类中有以下内容:

    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 的对象列表,其中只有第一个对象具有键:querysetResponsesSerializerrecord

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

json 验证序列 django-rest-viewsets

评论

0赞 willeM_ Van Onsem 7/3/2023
因为第一个没有错误。

答:

0赞 willeM_ Van Onsem 7/3/2023 #1

但我不知道为什么第一个对象是空的。

序列化程序验证列表中的所有元素,并且仅在所有项都有效的情况下才有效。

如果一个或多个项目无效,则返回错误。它通过字典列表来实现这一点,对于给定数据中的每个项目,它在错误列表中都有一个项目。这是有道理的,因为人们可能想知道哪个项目适用错误。因此,第一个字典包含第一项的错误。

由于第一项不包含错误,因此它是一个空字典,这意味着第一项有效,但其余部分无效。

只有当所有项目都匹配时才插入数据可能很有意义,因为人们通常希望操作是原子性的:要么全部成功(一起),要么根本没有成功。

我只想添加可以测试列表中每个对象的验证条件,即具有记录键或一定长度的项目。

通常你不会自己实现。将字段添加到序列化程序,例如:validate

class ResponsesSerializer(serializers.Serializer):
    record = serializer.CharField(required=True)

然后,这将检查是否确实存在字符串字段。record

或一定长度的项目。

在这种情况下,您可以使用 ,这本质上就是 a 的作用。您可以使用以下方法轻松构建它:ListSerializermany=True

serializer = ResponsesSerializer(many=True, min_length=5, max_length=5)

这将要求请求中正好有五个项目。