Управление результатом сериализации для сериализации many = true - PullRequest
0 голосов
/ 04 августа 2020

Я хочу манипулировать результатом сериализации many=True сериализации:

class CustomContentElementSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomContentElement
        fields = [
            'type',
            'html'
        ]

result = CustomContentElementSerializer(
    CustomContentElement.objects.all(),
    many=True
)

Я не хочу манипулировать результатом сериализации отдельного объекта, а полным списком. С функцией переопределения to_representation я просто могу манипулировать отдельными элементами возвращаемого списка.

Я думаю, что это сложно, потому что класс ModelSerializer устанавливает базовый класс в конструкторе (Строка 117: https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py)

Есть ли у кого-нибудь идея, как можно было бы манипулировать результатом в конце для many=True сериализации?

Решение (спасибо @ MSR974):

class CustomContentElementListSerializer(serializers.ListSerializer):
    
    def to_representation(self, data):
        data = super().to_representation(data)
        return self.manipulate_list_representation(data)

    def manipulate_list_representation(self, data):
        data.reverse()
        return data

class CustomContentElementSerializer(serializers.ModelSerializer):
    image = FilerImageFieldSerializer()

    class Meta:
        list_serializer_class = CustomContentElementListSerializer
        model = CustomContentElement
        fields = [
            'type',
            'col_id',               
        ]  

Это в документации по адресу https://www.django-rest-framework.org/api-guide/serializers/#customizing -listserializer-behavior

1 Ответ

2 голосов
/ 04 августа 2020

Да, как и ожидалось, «многие» означает, что сериализация повторяется x раз, где x - это номер объекта, который он должен обработать

Вероятно, вам следует go с настраиваемым ListSerializer

...