Задать вопрос
@Evtera

Как лучше написать сериалайзер enum и последующего отображения в drf_spectacular?

Здравствуйте. Хочу сделать конструктор для сериалайзеров enum , чтобы в дальнейшем использовать их во views и корректно отображать данные в сваггере, особенно в schema.
В текущей реализации возникает 2 проблемы.
1) мне кажется, логика чересчур перегружена и это все можно значительно упростить. Но как?
2) По какой-то причине сваггер для схемы подтягивает данные из другого enum, который вообще в другом приложении, а не из того, который передаем

Мой типовой enum
class EServicePlatform(models.IntegerChoices):
    ONLINE = 1, 'Онлайн'
    OFFLINE = 2, 'Оффлайн'


Которые напрямую отправляются во views в виде словаря

class DictionaryPlatforms(APIView):
    @extend_schema(responses={
        200: OpenApiResponse(response=DictionarySerializer(enum_class=EServicePlatform, many=True)),
        400: OpenApiResponse(description='Bad Request')}
    )
    def get(self, request, *args, **kwargs):
        data = [{"value": item.value, "label": item.label} for item in EServicePlatform]
        serializer = DictionarySerializer(data=data, many=True, enum_class=EServicePlatform)

        if serializer.is_valid():
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


сам сериалайзер конструктор

class DictionarySerializer(serializers.Serializer):
    value = serializers.ChoiceField(choices=[])  # Зададим пустой список по умолчанию
    label = serializers.CharField()

    def __init__(self, *args, **kwargs):
        # Ожидаем передачу enum_class через kwargs
        enum_class = kwargs.pop('enum_class', None)
        if not enum_class:
            raise ValueError("enum_class is required")

        # Динамически установим choices на основе переданного класса enum
        self.fields['value'].choices = enum_class.choices

        super().__init__(*args, **kwargs)
        self.enum_class = enum_class

    def validate(self, data):
        # Автоматически добавляем метку, соответствующую значению
        data['label'] = dict(self.enum_class.choices)[data['value']]
        return data
  • Вопрос задан
  • 12 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы