我正在学习Django Rest Framework教程-教程3基于类的视图。
如何将url字段(指向当前代码段)添加到序列化程序
序列化程序.py
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
from django.core.urlresolvers import reverse
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
urls.py
urlpatterns = [
url(r'^snippets/$', views.SnippetList.as_view()),
url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
]
实际输出
[
{
"id":1,
"title":"",
"code":"foo = "bar"n",
"linenos":false,
"language":"python",
"style":"friendly"
}
]
所需输出
[
{
"id":1,
"url":"http://192.168.28.131:8000/snippets/1/",
"title":"",
"code":"foo = "bar"n",
"linenos":false,
"language":"python",
"style":"friendly"
},
]
您必须使用HyperlinkedModelSerializer
串行器和HyperlinkedIdentityField
字段
来自Django Rest Framework文档
HyperlinkedModelSerializer
类类似于ModelSerializer类,但它使用超链接来表示关系,而不是主键。url字段将为使用HyperlinkedIdentityField
串行器字段表示,以及模型上的任何关系都将使用HyperlinkedRelatedField
串行器字段。
E.g(针对您的案例):
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='snippet-detail', read_only=True)
class Meta:
model = Snippet
fields = ('id', 'url', 'title', 'code', 'linenos', 'language', 'style')
当然,view_name
值必须与urls.py
中声明的url的名称相匹配(或不与其他地方声明的url相匹配),该url用于获取有关代码段的所有信息。
例如:
# urls.py
urlpatterns = [
url(r'^snippets/(?P<pk>[0-9]+)$', views.SnippetDetail.as_view(), name='snippet-detail'),
]
使用视图集时,将完整的反向url名称指定为view_name
class XyzSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(
view_name='app1:api:xyz-detail',
read_only=True
)
class Meta:
model = Xyz
fields = ( 'id', 'url')