刚刚进入Django Rest框架。我有一个简单的例子,其中一个模型通过RESTAPI呈现,模型中没有Related字段,只有一串字符串。将该模型的get_absolute_url()值呈现到JSON输出中的最简单方法是什么?我使用serializers.HyperlinkedModelSerializer是为了准备进入具有相关字段的更复杂的模型。
get_absolute_url()
serializers.HyperlinkedModelSerializer
dnph8jn41#
方法-1使用SerializerMethodField:
SerializerMethodField
您可以在序列化程式中使用SerializerMethodField,将get_absolute_url()值加入至对象的序列化表示。根据SerializerMethodField文件:这是一个只读字段。它通过调用其附加到的序列化程序类上的方法来获取其值。它可用于向对象的序列化表示形式中添加任何类型的数据。我们将在序列化器中为my_absolute_url字段定义一个方法get_my_abslute_url(),它将把对象的绝对url添加到序列化表示中。
my_absolute_url
get_my_abslute_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
source
您也可以使用URLField并将方法get_absolute_url传递给它。这将调用方法get_absolute_url并以序列化表示形式返回该值。来自关于source参数的DRF文档:将用于填充字段的属性的名称。可以是仅采用self argument的方法,如URLField('get_absolute_url'),也可以使用点标记法遍历属性,如EmailField(source='user.email')。
get_absolute_url
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在其文档中明确使用了这种方法。
erhoui1w2#
基本上,您需要利用串行化器的context中可用的request的build_absolute_uri()方法,如下所示:
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)
zbq4xfa03#
这可能是最新版本的drf中最好的方法,而不是URLField方法或SerializerMethodField方法:第一个读了drf的源代码后,source=get_absolute_url现在不工作了。
source=get_absolute_url
3条答案
按热度按时间dnph8jn41#
方法-1使用
SerializerMethodField
:您可以在序列化程式中使用
SerializerMethodField
,将get_absolute_url()
值加入至对象的序列化表示。根据
SerializerMethodField
文件:这是一个只读字段。它通过调用其附加到的序列化程序类上的方法来获取其值。它可用于向对象的序列化表示形式中添加任何类型的数据。
我们将在序列化器中为
my_absolute_url
字段定义一个方法get_my_abslute_url()
,它将把对象的绝对url添加到序列化表示中。方法2使用
URLField
和source
参数:您也可以使用
URLField
并将方法get_absolute_url
传递给它。这将调用方法get_absolute_url
并以序列化表示形式返回该值。来自关于
source
参数的DRF文档:将用于填充字段的属性的名称。可以是仅采用
self argument
的方法,如URLField('get_absolute_url')
,也可以使用点标记法遍历属性,如EmailField(source='user.email')
。我建议使用第二种方法,因为DRF在其文档中明确使用了这种方法。
erhoui1w2#
基本上,您需要利用串行化器的
context
中可用的request
的build_absolute_uri()
方法,如下所示:zbq4xfa03#
这可能是最新版本的drf中最好的方法,而不是
URLField
方法或SerializerMethodField
方法:第一个
读了drf的源代码后,
source=get_absolute_url
现在不工作了。