【问题标题】:DRF annotate nested serializerDRF 注释嵌套序列化器
【发布时间】:2019-11-22 03:22:27
【问题描述】:

我有一个使用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

【问题讨论】:

  • 不确定我是否理解您的问题。在OrderAPIViewSet中定义queryset值的时候为什么不注释呢?
  • @LucaBezerra OrderAPIViewSet 中的模型是 Order,我正在尝试注释 OrderLine 模型。我添加了更多代码,希望可以使问题更清楚。
  • 您需要数据库计算这些字段吗?如果没有,我建议您为每个所谓的 annotated 字段添加一个 @property 到您的 OrderLine 模型中,这些字段返回正确的值,并为 @ 中的每个属性声明一个 ReadOnlyField 987654334@

标签: django django-rest-framework


【解决方案1】:

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

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 来做吗?

【讨论】:

  • instance.annotated_field 对查询集中的每个实例进行查询,而使用注解则不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2021-05-23
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多