如何在DRF中对序列化程序自定义字段的值进行排序 [英] How to sort values of serializer custom field in DRF

查看:855
本文介绍了如何在DRF中对序列化程序自定义字段的值进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在客户端序列化程序中创建了一个自定义字段。
此字段的值是通过复杂的序列化器方法计算的。

I have created a custom field in the client serializer. The value of this field is calculated by a complex serializer method.

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):
            ...

我想让输出按照 total_spend_2019 。看来我在这里不能通过简单的 ordering =('total_spend_2019',)来做到这一点。在模型中,在视图中都不能这样做。

I would like to get the output sorted by the value of total_spend_2019. It looks like I cannot do it here with a simple ordering = ('total_spend_2019',) I cannot do it either in the model, neither in the view.

编辑:拥有一个可以与任何SerializerMethodField一起使用的通用解决方案将是很棒的。

It would be great to have a generic solution that would work with any 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)

有什么办法解决这个问题吗?

Any idea how to solve this?

非常感谢!!

推荐答案

好的,我设法用f来解决如下:

All right, I managed to solve it with the following:

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)

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

I don't know if it is the most performant way to do this, but it works.

这篇关于如何在DRF中对序列化程序自定义字段的值进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆