【问题标题】:How to change default behavior of serializers如何更改序列化程序的默认行为
【发布时间】:2019-05-05 12:31:02
【问题描述】:

我正在使用 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 上看了一些,但我还没有找到答案。

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

【问题讨论】:

  • 也许这会有所帮助:stackoverflow.com/questions/19253363/…
  • @marke 感谢您的回复。然而,这篇文章对我没有帮助。它旨在在当前响应的上方添加一个键。我喜欢摆脱列表,并在 json 中拥有更高级别的模型值之一
  • 您可能需要更改序列化程序响应

标签: django django-rest-framework


【解决方案1】:

您可以在您的序列化程序类中覆盖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

您只需创建一个 临时 数据字典并将当前实例 line 属性分配为您的 JSON 响应的键 - 最后您真正想要的:

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

注 1:在这种特殊情况下,您可能希望使用 ModelSerializer 而不是 Serializer,我认为使用起来更简单,您可以直接访问 instance.line,无需指定它实际上要被序列化。

注意 2:这里您的 topic 字段将被序列化为 id,因为它是数据库级别的 ForeignKey 关系。如果您想将topic 序列化为来自实际主题字段之一的CharField,请查看here

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 2016-11-05
    • 2013-04-18
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多