идентификатор отсутствует в validate () и обновлении ListSerializer () Django Rest Framework - PullRequest
1 голос
/ 26 сентября 2019

Я изучаю и знаком с Django Rest Framework, и у меня возникла проблема с проверками сериализатора и методом обновления ListSerializer.

У меня есть класс APIView, который обрабатывает запрос put.Я просто хотел получить пользовательскую проверку и поэтому я переопределил метод проверки в классе сериализатора.

Из почтальона я отправляю данные JSON в этот класс APIView.

Пример данных 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 (), он передает поток переопределенной функции проверки.Но там, когда я проверяю аргумент attrs, я получаю все поля, кроме id.Ключ и значение для id отсутствуют.Он показывает None.

Та же проблема возникла у меня, когда я пытался переопределить метод обновления в ListSerializer.

, когда я попробовал приведенный ниже код в методе обновления ListSerializer,

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 голосов
/ 26 сентября 2019

Если я правильно понимаю, проблема в том, что вы не видите поле id внутри validated_data.Если это так, я считаю, что это преднамеренно в рамках:

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

В основном, поле id по умолчанию read_only.Дайте мне знать, если у вас есть вопросы, на которые не ответил Том на эту проблему.

РЕДАКТИРОВАТЬ: Также не стесняйтесь делиться сценариями использования более высокого уровня (что вы планируете делать с идентификатором внутри проверки)и, возможно, мы можем предложить альтернативные подходы.

...