如何使用Django Rest Framework向序列化程序添加url字段



我正在学习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')