Nano Hash - криптовалюты, майнинг, программирование

Не удалось получить немодельное поле в validated_data сериализатора Django Rest Framework

У меня есть ItemCollection и Items в моих моделях Django, и я хочу иметь возможность удалять элементы из коллекции через пользовательский интерфейс. В запросе REST PUT я добавляю дополнительное логическое поле deleted для каждого элемента, чтобы сигнализировать о том, что элемент должен быть удален.

Правильный способ справиться с этим, по-видимому, заключается в методе update сериализатора. Моя проблема в том, что это немодельное поле deleted удаляется во время проверки, поэтому оно больше недоступно. Добавление deleted в качестве SerializerMethodField не помогло. На данный момент я получаю информацию deleted из атрибута initial_data сериализатора, но мне кажется, что это неправильно.

Мой текущий пример кода ниже. Кто-нибудь знает лучший подход?

Модели:

    class ItemCollection(models.Model):
        description = models.CharField(max_length=256)


    class Item(models.Model):
        collection = models.ForeignKey(ItemCollection, related_name="items")

Сериализаторы:

    from django.shortcuts import get_object_or_404
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import serializers
    from models import Item, ItemCollection


    class ItemSerializer(serializers.ModelSerializer):

        class Meta:
            model = Item


    class ItemCollectionSerializer(serializers.ModelSerializer):

        items = ItemSerializer(many=True, read_only=False)

        class Meta:
            model = ItemCollection

        def update(self, instance, validated_data):
            instance.description = validated_data['description']
            for item, item_obj in zip(
                   self.initial_data['items'], validated_data['items']):
                if item['delete']:
                    instance.items.filter(id=item['id']).delete()
            return instance


    class ItemCollectionView(APIView):

        def get(self, request, ic_id):
            item_collection = get_object_or_404(ItemCollection, pk=ic_id)
            serialized = ItemCollectionSerializer(item_collection).data
            return Response(serialized)

        def put(self, request, ic_id):
            item_collection = get_object_or_404(ItemCollection, pk=ic_id)
            serializer = ItemCollectionSerializer(
               item_collection, data=request.data)
            if serializer.is_valid(raise_exception=True):
                serializer.save()
            return Response(serializer.data)

И пример json в запросе PUT:

    {
        "id": 2,
        "items": [
            {
                "id": 3,
                "collection": 2,
                "delete": true
            }
        ],
        "description": "mycoll"
    }

  • Было бы приемлемо просто сделать отдельный HTTP DELETE для каждого из вложенных модулей, которые необходимо удалить? Если бы вы использовали serializers.HyperlinkedModelSerializer в качестве базового класса ваших сериализаторов, каждый подэлемент имел бы URL-адрес, который вы могли бы легко DELETE. 05.06.2015
  • Это интересный угол для изучения. Хотя основная проблема заключается в том, что в validated_data отсутствует информация о том, какие элементы необходимо удалить. 05.06.2015
  • Я имею в виду, что на стороне клиента вместо установки флага delete для подэлемента просто выполните HTTP DELETE для этого объекта и удалите его из контейнера. Вы не делаете DELETE изнутри Django (если я могу предположить, что вы намекали на этот подход.) 05.06.2015
  • Ах, я неправильно понял. Хороший подход, ТС! 05.06.2015

Ответы:


1

Вы можете добавить немодельные поля обратно, перезаписав to_internal_value fn:

def to_internal_value(self, data):
    internal_value = super(MySerializer, self).to_internal_value(data)
    my_non_model_field_raw_value = data.get("my_non_model_field")
    my_non_model_field_value = ConvertRawValueInSomeCleverWay(my_non_model_field_raw_value)
    internal_value.update({
        "my_non_model_field": my_non_model_field_value
    })
    return internal_value

Затем вы можете обработать его, как хотите, в create или update.

20.10.2015

2

Если вы выполняете запрос PUT, ваше представление, вероятно, вызывает self.perform_update(serializer). Измените его на

serializer.save(<my_non_model_field>=request.data.get('<my_non_model_field>', <default_value>)

Все kwargs передаются в validated_data вашему сериализатору. Убедитесь, что входящее значение правильно преобразовано (в логическое, в int и т. д.).

04.03.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..