Переопределить to_representation в классе List сериализатора - PullRequest
0 голосов
/ 15 октября 2018

У меня есть сериализатор, который реализует класс BaseSerializer, в котором я использую функцию to_representation для вызова функции следующим образом:

class ItemSerializer(serializers.BaseSerializer):
    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret['log'] = SERVICE.log(instance.id)
        return ret

    class Meta:
        list_serializer_class = ItemListSerializer
        model = models.Item
        fields = '__all__'

У меня также есть сериализатор списка длятот же ItemListSerializer, который выглядит следующим образом:

class ItemListSerializer(serializers.ListSerializer):
    def create(self, validated_data):
        items = [models.Item(**item) for item in validated_data]
        return models.Item.objects.bulk_create(items)

Я хочу переопределить метод to_representation в ItemSerializer, когда я хочу получить весь список элементов.В основном я хочу избежать вызова функции для каждого элемента и вместо этого выполнить массовый вызов для всех элементов, когда список элементов запрашивается по соображениям производительности.

Есть ли хороший способ сделать это?Я следовал этим документам для создания ItemListSerializer: https://www.django -rest-framework.org / api-guide / serializers / # customizing-listserializer-поведения , но он говорит только о переопределении методов создания и обновления.

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете получить доступ ко всем элементам в ListSerializer.to_representation

Это должно быть хорошим местом, чтобы делать то, что вы хотите.

Метод выглядит следующим образом:

def to_representation(self, data):
    """
    List of object instances -> List of dicts of primitive datatypes.
    """
    # Dealing with nested relationships, data can be a Manager,
    # so, first get a queryset from the Manager if needed
    iterable = data.all() if isinstance(data, models.Manager) else data

    return [
        self.child.to_representation(item) for item in iterable
    ]

Но, честно говоря, я не понимаю, что бы вы получили от этого.Ваш сценарий использования выглядит так, как будто это не измеримое повышение производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...