在 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
:
您可以在序列化程序中使用SerializerMethodField
将get_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 使用 URLField
和 source
参数:
您也可以使用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
中可用的request
的build_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 值的主要内容,如果未能解决你的问题,请参考以下文章