在JSON输出中包含get_absolute_url值

时间:2015-10-08 12:42:30

标签: django django-rest-framework

刚进入Django Rest Framework。

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

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

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

2 个答案:

答案 0 :(得分:9)

方法-1使用SerializerMethodField

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

根据SerializerMethodField docs:

  

这是一个只读字段。它通过调用方法获得它的价值   它所附加的序列化程序类。 可用于添加任何内容   将数据排序到对象的序列化表示。

我们将为序列化器中的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

方法-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已在其文档中明确使用此方法。

答案 1 :(得分:1)

我必须自己解决这个问题。基本上,您将需要利用序列化程序request中可用的context的{​​{3}}方法,就像这样:

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)