首页 > 解决方案 > 如何序列化自定义查询集结果?

问题描述

在 django 模型序列化器中,典型的用例如下

class SalesManSerializer(serializers.ModelSerializer):
    class Meta:
        module = models.SalesMan 
        fields = ('id', 'name')

id、name 均来自 salse man 模型。

但是,如果我有另一个引用 SalseMan 的名为 Order 的模型。我想查询每个销售人员得到多少订单。

SQL就像

SELECT ID, NAME, COUNT(ORDER.ID) FROM SALSE_MAN, ORDER WHERE ORDER.UID = SALSE_MAN.ID GROUP BY SALSE_MAN.ID

如何序列化这个查询?

标签: djangodjango-rest-framework

解决方案


模型序列化器默认只序列化模型字段。但好消息是您始终可以将自定义字段添加到您的序列化程序。

不知道你的模型到底是什么,但在代码中它可能看起来像:

class SalesManSerializer(serializers.ModelSerializer):
    total_orders = serializers.IntegerField()

    class Meta:
        module = models.SalesMan
        fields = ('id', 'name', 'total_orders')

序列化器只负责序列化。他们不为我们构建查询集。也就是说,您需要自己注释查询集。无论是在视图中还是查询集将被初始化并传递给序列化程序的任何地方,您都可以使用注释来注释带有订单计数的对象。

例如:

class SalesManViewSet(viewsets.ModelViewSet):
    serializer_class = SalesManSerializer

    def get_queryset(self):
        return SalesMan.objects.annotate(
            total_trucks = Count('orders'),
        )

推荐阅读