在 JSON 输出中包含 get_absolute_url 值

Posted

技术标签:

【中文标题】在 JSON 输出中包含 get_absolute_url 值【英文标题】:Including the get_absolute_url value in JSON output 【发布时间】:2016-01-06 02:19:28 【问题描述】:

刚刚进入 Django Rest 框架。

我有一个简单的示例正在运行,其中模型通过 REST API 呈现。模型中没有相关字段,只是一堆字符串。

将该模型的 get_absolute_url() 值呈现到 JSON 输出中的最简单方法是什么?

我正在使用serializers.HyperlinkedModelSerializer 准备进入具有相关领域的更复杂的模型。

【问题讨论】:

我在这个relevant post找到了很多答案 【参考方案1】:

方法一使用SerializerMethodField

您可以在序列化程序中使用SerializerMethodFieldget_absolute_url() 值添加到对象的序列化表示中。

根据SerializerMethodField docs:

这是一个只读字段。它通过调用一个方法来获取它的值 它附加到的序列化程序类。 它可以用来添加任何 将数据排序到对象的序列化表示中。

我们将在序列化程序中为my_absolute_url 字段定义一个方法get_my_abslute_url(),它将对象的绝对url 添加到序列化表示中。

class MyModelSerializer(serializers.ModelSerializer):

    my_absolute_url = serializers.SerializerMethodField() # define a SerializerMethodField        

    def get_my_absolute_url(self, obj):
        return obj.get_absolute_url() # return the absolute url of the object

方法 2 使用 URLFieldsource 参数:

您也可以使用URLField 并将方法get_absolute_url 传递给它。这将调用方法get_absolute_url 并在序列化表示中返回该值。

来自source argument:上的 DRF 文档

将用于填充该字段的属性的名称。 五月 是一个只接受self argument 的方法,例如 URLField('get_absolute_url'),也可以用点符号遍历 属性,例如EmailField(source='user.email')

class MyModelSerializer(serializers.ModelSerializer):

    my_absolute_url = serializers.URLField(source='get_absolute_url', read_only=True) 

我建议使用第二种方法,因为 DRF 在其文档中明确使用了此方法。

【讨论】:

如何将协议、主机名和端口添加到生成的 url?【参考方案2】:

只需要自己处理。基本上你会想要利用序列化程序的context 中可用的requestbuild_absolute_uri() 方法,如下所示:

class FooSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Foo
        fields = ("web_url",)

    web_url = serializers.SerializerMethodField()

    def get_web_url(self, obj):
        obj_url = obj.get_absolute_url()
        return self.context["request"].build_absolute_uri(obj_url)

【讨论】:

以上是关于在 JSON 输出中包含 get_absolute_url 值的主要内容,如果未能解决你的问题,请参考以下文章

从值中包含逗号的 JSON 中提取键值对

如何在持续集成中包含谷歌基准

Python setup.py 在 egg 中包含 .json 文件

如何使用 Jackson 在对象中包含原始 JSON?

在 GeoJson 对象中包含 JSON 流?

在 Swift 的异步调用中包含返回处理程序