id 不存在于 validate() 和 ListSerializer 的 update() Django Rest Framework 中

Aas*_*lli 5 django django-rest-framework

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

我有一个处理放置请求的 APIView 类。我只是想进行自定义验证,因此我在序列化程序类中覆盖了验证方法。

我从邮递员那里向这个 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"
}
]

Run Code Online (Sandbox Code Playgroud)

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

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

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

data_mapping = {item['id']: item for item in validated_data}
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,提示 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

Run Code Online (Sandbox Code Playgroud)

MrN*_*ame 13

如果我理解正确,问题是您看id不到validated_data. 如果是这样,我相信这是框架中故意的:

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

基本上,该id字段是read_only默认的。如果 Tom 对该问题的回复未能解答您的疑问,请告诉我。

编辑:也请随意分享更高级别的用例(您计划在验证中使用 ID 做什么),也许我们可以提供替代方法。