刚进入Django Rest Framework。
我有一个简单的示例运行,其中通过REST API呈现模型。模型中没有相关字段,只是一堆字符串。
将该模型的get_absolute_url()
值呈现给JSON输出的最简单方法是什么?
我正在使用serializers.HyperlinkedModelSerializer
准备进入具有相关字段的更复杂的模型。
答案 0 :(得分:9)
方法-1使用SerializerMethodField
:
您可以在序列化程序中使用SerializerMethodField
将get_absolute_url()
值添加到对象的序列化表示中。
这是一个只读字段。它通过调用方法获得它的价值 它所附加的序列化程序类。 可用于添加任何内容 将数据排序到对象的序列化表示。
我们将为序列化器中的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使用URLField
与source
参数:
您还可以使用URLField
并将方法get_absolute_url
传递给它。这将调用方法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已在其文档中明确使用此方法。
答案 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)