如何序列化自定义查询集结果?

时间:2018-10-06 04:32:21

标签: django django-rest-framework

在Django模型序列化器中,典型的使用情况如下所示

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

id,名字全都来自salse man模型。

但是,如果我有另一个模型称为Order,它引用了SalseMan。我想查询每个销售员获得多少订单。

SQL就像

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

如何序列化此查询?

2 个答案:

答案 0 :(得分:2)

模型序列化程序默认情况下仅序列化模型字段。但是好消息是,您始终可以将自定义字段添加到序列化程序中。

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

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

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

序列化器仅负责序列化。他们不为我们构造查询集。也就是说,您需要自己注释查询集。在视图中或查询集将被初始化并传递到序列化器的任何位置,您都可以使用annotation来对带有订单数的对象进行注释。

例如:

class SalesManViewSet(viewsets.ModelViewSet):
    serializer_class = SalesManSerializer

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

答案 1 :(得分:0)

您可以使用methodfield

添加它
class SalesManSerializer(serializers.ModelSerializer):
    count = serializers.SerializerMethodField()

    class Meta:
        model = models.SalesMan 
        fields = ('id', 'name', 'count')

    def get_count(self, instance):
        return Order.objects.count()