Обмен данными между методами в сериализаторе (Django Rest Framework) - PullRequest
0 голосов
/ 28 мая 2020

У меня довольно тяжелые вычисления и много доступа к базе данных, но их можно использовать повторно в SerializerMethodField из ModelSerializer, как мне получить эти расчетные данные для всего метода.

Пример кода

class MySerializer(serializers.ModelSerializer):
    a = serializers.SerializerMethodField()
    b = serializers.SerializerMethodField()

    def get_a(self, obj):
        result_x = heavy_calculation(self.context['request'].user, obj)
        return result_x + 1

    def get_b(self, obj):
        result_x = heavy_calculation(self.context['request'].user, obj)
        return result_x + 2

heavy_calculation () в обоих методах - это одна и та же функция, поэтому result_x будет одинаковым ответом для любых запросов. Я хотел бы сделать вызов heavy_calculation () только один раз для каждого запроса, чтобы уменьшить нагрузку (моя настоящая работа хотела бы вызывать 10+ раз)

С уважением,

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Для вашего случая есть несколько вариантов:

  • Если бы вы могли переписать свой класс сериализатора:
    class MySerializer(serializers.ModelSerializer):
        a = serializers.IntegerField()

        def calc_a(self, obj):
            return self._cached_result + 1

        def to_representation(self, instance):
            data = super().to_representation(instance)
            self._cached_result = heavy_calculation(self.context['request'].user, instance)
            data['a'] = self.calc_a(instance)
            ...
            return data
@lru_cache
def heavy_calculation(user, obj):
   ...
  • Существует django -memoize библиотека, которая кэширует результат вашей функции (вы необходимо настроить кеш для вашего Django сайта)
@memoize(timeout=60)
def heavy_calculation(user, obj):
    ...
0 голосов
/ 28 мая 2020

Есть несколько способов добиться этого.
1. Вы можете переопределить init и заполнить данные с помощью object_id и получить словарь.
2. Вы можете написать сериализатор списка и переопределить данные собственности и заселять самостоятельно. Руководство по написанию сериализатора списков здесь

...