如何更改序列化程序的默认行为

时间:2019-05-05 12:31:03

标签: django django-rest-framework

我正在使用Django restframework做一些事情。现在非常基本,但是我希望数据返回给我的方式有所不同。

这是我现在得到回复的方式:

[
    {
        "line": "line1",
        "user_text": "Some text",
        "topic": "value/xrp"
    },
    {
        "line": "line2",
        "user_text": "Some text 2",
        "topic": "beer/heineken/sale"
    }
]

这就是我想要得到的:

{
    "line1": {
        "user_text": "Some text",
        "topic": "value/xrp"
    },
    "line2": {
        "user_text": "Some text 2",
        "topic": "beer/heineken/sale"
    }
}

这是我的序列化器:

class LineSerializer(serializers.Serializer):
    line = serializers.CharField(max_length=16)
    user_text = serializers.CharField(max_length=16)
    topic = serializers.CharField()

这是视图

class DisplayDetailAPIView(ListAPIView):
    serializer_class = LineSerializer

    def get_queryset(self):
        return Line.objects.filter(display__serial_number=self.kwargs['serial_number'])

和模型(作为参考)

class Line(models.Model):
    display = models.ForeignKey(Display, on_delete=models.CASCADE, related_name='lines')
    line = models.CharField(max_length=16)
    user_text = models.CharField(max_length=16, null=True, blank=True)
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE, blank=True, null=True)

    def __str__(self):
        return self.line

我查看了其余框架文档以及一些关于stackoverflow的信息,但还没有找到答案。

如果有人对我有暗示,将不胜感激:)

1 个答案:

答案 0 :(得分:0)

您可以在序列化程序类中覆盖to_representation

class LineSerializer(serializers.ModelSerializer):
    class Meta:
        model = Line
        fields = ('user_text', 'topic')

    def to_representation(self, instance):
        data = super().to_representation(instance)

        response_data = {}
        response_data[instance.line] = data

        return response_data

您只需创建一个 temporary 数据字典,然后将当前实例line属性指定为JSON响应的键-最终您实际上想要的是:

[
    {
        "line1": {
            "user_text": "lorem ipsum",
            "topic": ...
        }
    },
    {
        "line2": {
            "user_text": "dolor sin amet",
            "topic": ...
        }
    }
]

注释1 :在这种特殊情况下,您可能希望使用ModelSerializer而不是Serializer,我认为它更易于使用,您可以访问{{ 1}},而无需指定它实际要序列化。

注释2 :在这里,您的instance.line字段将被序列化为topic,因为它是数据库级别的id关系。如果要从实际主题的一个字段中将ForeignKey序列化为topic,请查看here