id在validate()和ListSerializer的update()Django Rest Framework

时间:2019-09-26 19:11:28

标签: django django-rest-framework

我正在学习并且是Django Rest Framework的新手,并且在序列化程序验证和ListSerializer更新方法方面遇到问题。

我有一个APIView类,可以处理放置请求。我只想进行自定义验证,因此在序列化程序类中重写了validate方法。

我要从邮递员向此APIView类发送JSON数据。

示例JASON数据:

[
{
            "id": 1,
            "ip": "10.1.1.1",
            "host_name": "hostname 1"
},
{
            "id": 2,
            "ip": "10.1.1.2",
            "host_name": "hostname 2"
}
]

当我收到数据并执行serializer.is_valid()时,它将流传递给重写的validate函数。但是在那里,当我检查attrs参数时,我得到了除id以外的所有字段。 id的键和值不存在。它显示无。

当我尝试覆盖ListSerializer中的更新方法时,我遇到了同样的问题。

当我在ListSerializer的update方法中尝试以下代码时,

data_mapping = {item['id']: item for item in validated_data}

我收到一个错误消息,说KeyError'id'。

似乎不接受id字段,我不确定为什么!请,如果我在任何地方错了,请有人向我解释。

序列化器类

from rest_framework import serializers
from .models import NoAccessDetails


class NoAccessDetailsListSerializer(serializers.ListSerializer):
    def update(self, instance, validated_data)

        data_mapping = {data.id: data for data in instance}

        #Here I'm getting KeyError ID
        validated_data_mapping = {item['id']: item for item in validated_data}

        return 


class NoAccessDetailsSerializer(serializers.ModelSerializer):

    class Meta:
        model = NoAccessDetails
        list_serializer_class = NoAccessDetailsListSerializer
        fields = ("id", "ip", "host_name")

    def validate(self, data):

        id_val = data.get('id')
        ip = data.get('ip')
        host_name = data.get('host_name')

        #here the id value is None
        print('id val {} '.format(id_val))
        return data

1 个答案:

答案 0 :(得分:0)

如果我的理解正确,则问题在于您没有在id内看到validated_data字段。如果是这样,我认为这在框架中是有意的:

https://github.com/encode/django-rest-framework/issues/2320

基本上,id字段默认为read_only。让我知道您是否有汤姆对此问题的回答未解决的问题。

编辑:也可以随时共享更高级别的用例(您打算在验证内部使用ID进行操作),也许我们可以提供替代方法。