在JSON输出中包含get_absolute_url值

Sim*_*ris 6 django django-rest-framework

刚进入Django Rest Framework.

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

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

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

Rah*_*pta 9

方法-1使用SerializerMethodField:

您可以SerializerMethodField在序列化程序中使用a 将get_absolute_url()值添加到对象的序列化表示中.

根据SerializerMethodField文档:

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

我们将在序列化器中get_my_abslute_url()为该my_absolute_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
Run Code Online (Sandbox Code Playgroud)

方法-2使用URLFieldsource参数:

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

来自DRF文档的source论证:

将用于填充字段的属性的名称.可能是一种只采用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) 
Run Code Online (Sandbox Code Playgroud)

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

  • 如何将协议、主机名和端口添加到生成的 url 中? (2认同)