Сериализация динамического поля с использованием Serpy - PullRequest
0 голосов
/ 23 октября 2018

Я использовал DRF serializers.ModelSerializer, но с сериализацией сотен данных он медленен и требует огромного времени процессора.

Я переключился на Serpy [GITHUB LINK] ,Это отличная библиотека, она ДЕЙСТВИТЕЛЬНО БЫСТРАЯ, работает как чудо, снижая время сериализации на 50/70% меньше, чем стандартные DRF ModelSerializer.

Используя DynamicModelSerializer в DRF, моя жизнь была довольно простой,на самом деле, я смог использовать поля = (' all ') в моем старом классифицированном сериализаторе DRF, а затем, добавив дополнительный параметр exclude, смог исключить некоторые ненужные параметры из моего сериализатора, вот класс DynamicModelSerializer:

class DynamicModelSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields', None)
        add_fields = kwargs.pop('add_fields', None)
        exclude = kwargs.pop('exclude', None)
        nest = kwargs.pop('nest', None)

        if nest is not None:
            self.Meta.depth = nest

        super(DynamicModelSerializer, self).__init__(*args, **kwargs)

        if fields is not None:
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)

        if add_fields is not None:
            for field_name, field_class in add_fields.items():
                ### first pop the old field class from the fields if it's there
                if field_name in self.fields:
                    self.fields.pop(field_name)
                ### now add the field to the fields
                self.fields[field_name] = field_class

        if exclude is not None:
            for field_name in exclude:
                self.fields.pop(field_name)

Теперь, как я могу сделать это с Serpy?я попытался создать подкласс класса serpy.Serializer и обойти его, как показано ниже:

class SerpyDynamicModelSerializer(serpy.Serializer):

    def __new__(cls, *args, **kwargs):
        if cls.Meta.model:
            fields_list = [setattr(cls, f.name, serpy.Field()) for f in cls.Meta.model._meta.get_fields()]

Но под капотом кажется, что сериализатор наследует второй класс SerializerMeta и готовится вкоторые классифицируют поля для сериализации.

Моя цель:

  • Сериализация всех полей по умолчанию
  • Иметь возможность добавлять / исключать некоторые дополнительные поля во время выполнения

Это возможно?

Спасибо.

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