我正在学习并且是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
答案 0 :(得分:0)
如果我的理解正确,则问题在于您没有在id
内看到validated_data
字段。如果是这样,我认为这在框架中是有意的:
https://github.com/encode/django-rest-framework/issues/2320
基本上,id
字段默认为read_only
。让我知道您是否有汤姆对此问题的回答未解决的问题。
编辑:也可以随时共享更高级别的用例(您打算在验证内部使用ID进行操作),也许我们可以提供替代方法。