Создание шаблонов атрибутов уровня класса Python для создания обобщенных сериализаторов отдыха - PullRequest
1 голос
/ 07 ноября 2019

Я использую Django Rest Framework и хотел бы сериализовать разные типы, используя один и тот же формат. Формат представляет собой список всех экземпляров определенного типа, а также определенного выбранного экземпляра.

Моя проблема заключается в том, что мне нужно написать отдельный класс сериализатора для каждого типа, который я хочу сериализовать. В C ++ я решил бы это, указав тип и сериализатор типов в качестве аргумента шаблона. Как я могу сделать это в Python?

Универсальный объект, который я хотел бы сериализовать:

class OptionSelect(object):
    def __init__(self, options, selected):
        self.options = options
        self.selected = selected

Что мне сейчас нужно для сериализации:

class TypeAOptionSerializer(serializers.Serializer):
    options = TypeASerializer(many=True)
    selected = TypeASerializer()

class TypeBOptionSerializer(serializers.Serializer):
    options = TypeBSerializer(many=True)
    selected = TypeBSerializer()

class TypeCOptionSerializer(serializers.Serializer):
    options = TypeCSerializer(many=True)
    selected = TypeCSerializer()

Вместо этого я хотел бы создать Сериализатор, подобный этому:

class OptionSerializer(serializers.Serializer):
    options = serializer(many=True)
    selected = serializer()
    def __init__(self, serializer):
        self.serializer = serializer
        super().__init__()

Может быть, я должен использовать другой подход?

1 Ответ

1 голос
/ 10 ноября 2019

Вы можете попробовать следующее:

def create_serializer(serializer):
  class MySerializer(serializers.Serializer):
    options = serializer(many=True)
    selected = serializer()
  return MySerializer

TypeAOptionSerializer = create_serializer(TypeASerializer)
TypeBOptionSerializer = create_serializer(TypeBSerializer)
TypeCOptionSerializer = create_serializer(TypeCSerializer)

Это должно быть эквивалентно вашему текущему подходу с тремя отдельными классами.

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