django 在JSON输出中包含get_absolute_url值

axr492tv  于 2022-12-01  发布在  Go
关注(0)|答案(3)|浏览(143)

刚刚进入Django Rest框架。
我有一个简单的例子,其中一个模型通过RESTAPI呈现,模型中没有Related字段,只有一串字符串。
将该模型的get_absolute_url()值呈现到JSON输出中的最简单方法是什么?
我使用serializers.HyperlinkedModelSerializer是为了准备进入具有相关字段的更复杂的模型。

dnph8jn4

dnph8jn41#

方法-1使用SerializerMethodField

您可以在序列化程式中使用SerializerMethodField,将get_absolute_url()值加入至对象的序列化表示。
根据SerializerMethodField文件:
这是一个只读字段。它通过调用其附加到的序列化程序类上的方法来获取其值。它可用于向对象的序列化表示形式中添加任何类型的数据。
我们将在序列化器中为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参数的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在其文档中明确使用了这种方法。

erhoui1w

erhoui1w2#

基本上,您需要利用串行化器的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)
zbq4xfa0

zbq4xfa03#

这可能是最新版本的drf中最好的方法,而不是URLField方法或SerializerMethodField方法:
第一个
读了drf的源代码后,source=get_absolute_url现在不工作了。

相关问题