Я использовал 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
и готовится вкоторые классифицируют поля для сериализации.
Моя цель:
- Сериализация всех полей по умолчанию
- Иметь возможность добавлять / исключать некоторые дополнительные поля во время выполнения
Это возможно?
Спасибо.