如何在 DRF 中对序列化程序自定义字段的值进行排序

Ann*_*hie 2 python django django-rest-framework

我在客户端序列化程序中创建了一个自定义字段。该字段的值由复杂的序列化器方法计算。

class ClientsStatsSerializer(serializers.ModelSerializer):
    """
    Serializer shows total_spend for 2019 by client.
    """
    refs_count = serializers.SerializerMethodField()
    total_spend_2019 = serializers.SerializerMethodField()

    class Meta:
        model = Company
        ordering = ('total_spend_2019',)
        fields = [
            'id',
            'legal_name',
            'refs_count',
            'total_spend_2019',
        ]
        def get_total_spend_2019(self, obj):
            ...

Run Code Online (Sandbox Code Playgroud)

我想让输出按 的值排序total_spend_2019。看起来我不能在这里做一个简单的ordering = ('total_spend_2019',)我不能在模型中做,也不能在视图中做。

编辑:拥有一个适用于任何 SerializerMethodField 的通用解决方案会很棒。

目前的观点是这样的:

class ClientsStatsViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = request.user.company.clients.all()

        client_id = self.request.query_params.get('client_id', None)
        if client_id is not None:
            queryset = queryset.filter(pk=client_id)

        serializer = ClientsStatsSerializer(queryset, many=True)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?

非常感谢!!

Ann*_*hie 5

好吧,我设法解决了以下问题:

class ClientsStatsViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = request.user.company.clients.all()

        client_id = self.request.query_params.get('client_id', None)
        if client_id is not None:
            queryset = queryset.filter(pk=client_id)

        serializer = ClientsStatsSerializer(queryset, many=True)
        serializer_data = sorted(
            serializer.data, key=lambda k: k['total_spend_2019'], reverse=True)
        return Response(serializer_data)
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是执行此操作的最高效方法,但它有效。