如何使用 Django Rest Framework 将 url 字段添加到序列化程序
How to add an url field to a serializer with Django Rest Framework
我正在学习 Django Rest Framework - Tutorial 3 Class based views 上的教程。
如何将 url 字段(指向当前片段)添加到序列化程序?
serializers.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 documentation
The HyperlinkedModelSerializer
class is similar to the
ModelSerializer class except that it uses hyperlinks to represent
relationships, rather than primary keys. The url field will be
represented using a HyperlinkedIdentityField
serializer field, and
any relationships on the model will be represented using a
HyperlinkedRelatedField
serializer field.
例如(你的案例):
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 的名称相匹配(或其他地方没有),用于获取有关片段的所有信息。
例如:
# 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')
我正在学习 Django Rest Framework - Tutorial 3 Class based views 上的教程。
如何将 url 字段(指向当前片段)添加到序列化程序?
serializers.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 documentation
The
HyperlinkedModelSerializer
class is similar to the ModelSerializer class except that it uses hyperlinks to represent relationships, rather than primary keys. The url field will be represented using aHyperlinkedIdentityField
serializer field, and any relationships on the model will be represented using aHyperlinkedRelatedField
serializer field.
例如(你的案例):
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 的名称相匹配(或其他地方没有),用于获取有关片段的所有信息。
例如:
# 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')