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

Программы на Python
Ответить
Anonymous
 Как лучше всего написать сериализатор для перечисления и последующего отображения в drf_spectacular?

Сообщение Anonymous »

Я хочу создать конструктор для сериализаторов перечислений, чтобы позже использовать их в представлениях и правильно отображать данные в Swagger, особенно в схеме.
Мое типичное перечисление:

Код: Выделить всё

class EServicePlatform(models.IntegerChoices):
ONLINE = 1, 'Online'
OFFLINE = 2, 'Offline'

Которые напрямую отправляются представлениям в виде словаря:
django
Копировать код

Код: Выделить всё

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=[])  # Set an empty list by default
label = serializers.CharField()

def __init__(self, *args, **kwargs):
# Expect enum_class to be passed via kwargs
enum_class = kwargs.pop('enum_class', None)
if not enum_class:
raise ValueError("enum_class is required")

# Dynamically set choices based on the passed enum class
self.fields['value'].choices = enum_class.choices

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

def validate(self, data):
# Automatically add the label corresponding to the value
data['label'] = dict(self.enum_class.choices)[data['value']]
return data

В текущей реализации возникают две проблемы:

[*]Мне кажется, что логика слишком сложна и ее можно существенно упростить. Но как?
[*]По какой-то причине Swagger извлекает данные из другого перечисления, которое находится совсем в другом приложении, а не из того, которое мы передаем.


Подробнее здесь: https://stackoverflow.com/questions/792 ... play-in-dr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»