DRF注释嵌套序列化器

时间:2019-07-12 10:58:18

标签: django django-rest-framework

我有一个用many=True初始化的嵌套序列化器,并且想使用SerializerMethodField()在输出中添加许多带注释的字段。

如何在没有overriding the manager's default get_queryset method的情况下注释OrderLineSerializer查询集?

class OrderLineSerializer(serializers.ModelSerializer):
    annotated_field_1 = serializers.SerializerMethodField()
    annotated_field_2 = serializers.SerializerMethodField()
    annotated_field_3 = serializers.SerializerMethodField()

    class Meta:
        model = OrderLine
        fields = (
            'annotated_field_1',
            'annotated_field_2',
            'annotated_field_3',
        )

    def get_annotated_field_1(self, instance):
        return str(instance.annotated_field_1)

class OrderSerializer(serializers.ModelSerializer):
    lines = OrderLineSerializer(many=True)

    class Meta:
        model = Order
        fields = (
            'id'
            'lines'
        )

class OrderAPIViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

1 个答案:

答案 0 :(得分:0)

您可以在SerializerMethodField中使用OrderSerializer。像这样:

class OrderSerializer(serializers.ModelSerializer):
    lines = serializers.SerializerMethodField()

    def get_lines(self, instance):
        annotated_lines = instance.lines.annotate(annotated_field_1=...)
        return OrderLineSerializer(annotated_lines, many=True).data

    class Meta:
        model = Order
        fields = (
            'id'
            'lines'
        )

这感觉很奇怪,例如,您真的需要注释而不是property吗?