Как динамически сериализовать поле, если я заранее не знаю, какой сериализатор будет выбран?

#python-3.x #django #serialization #django-rest-framework #django-serializer

#python-3.x #django #сериализация #django-rest-framework #django-сериализатор

Вопрос:

У меня есть простой сериализатор:

 class BoxSerializer(Serializer):
    modelName = serializers.CharField(required=True)
    body = ???
 

И я хочу сериализовать поле ‘body’ в зависимости от поля ‘ModelName’. Например, если имямоДели равно ‘Phone’, то я хочу использовать PhoneSerializer для поля ‘body’. Если ModelName ‘book’ я хочу использовать BookSerializer и так далее. Как я могу это реализовать?
Пожалуйста, обратите внимание, что я не собираюсь ничего сохранять в базе данных

Ответ №1:

Для лучшей практики вы можете реализовать :

 class BoxSerializer(Serializer):
    modelName = serializers.CharField(required=True)
    body = serializers.SerializerMethodField()
    
    def get_body(self,box):
        if box.modelName == "x":
            return XSerializer(box.body)
        elif box.modelName == "y":
            return YSerializer(box.body)
 

Ответ №2:

Попробуйте что-то подобное, получите значение поля, а затем выберите сериализатор внутри if else блока:

 @api_view(['GET', 'POST'])
def serialize(request, pk):
    box = Box.objects.get(pk=pk)
    if box.modelName = 'x':
        serializer = BoxSerializerX(box)
    else:
        serializer = BoxSerializerY(box)
    return Response(serializer.data)
 

Комментарии:

1. Для этого вам понадобится пара сериализаторов (очевидно)