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

2024-03-29 04:46:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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',)在模型中也不能这样做,在视图中也不能。在

编辑:最好有一个通用的解决方案来处理任何SerializerMethodField。在

目前的看法是:

^{pr2}$

你知道怎么解决这个问题吗?在

非常感谢!!在


Tags: 方法程序客户机序列化countclasstotalserializer
2条回答

也可以尝试创建自定义模型管理器。这是订购数据的流行决策:

models.py

class CustomManager(models.Manager):
    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(...).order_by(...)


class Company(models.Model):
    ...

   objects = models.Manager
   custom_manager = CustomManager()


views.py

class CompanyViewSet(viewsets.ViewSet):
    ...
    queryset = Company.custom_manager.all()
    ...

好吧,我用以下方法解决了这个问题:

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)

我不知道这是否是最有效的方法,但它是有效的。在

相关问题 更多 >