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

Bas*_*ijk 4 python django django-urls django-rest-framework

我正在关注Django Rest Framework - Tutorial 3基于类的视图的教程.

如何将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')
Run Code Online (Sandbox Code Playgroud)

urls.py

urlpatterns = [
    url(r'^snippets/$', views.SnippetList.as_view()),
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

实际输出

[  
   {  
      "id":1,
      "title":"",
      "code":"foo = \"bar\"\n",
      "linenos":false,
      "language":"python",
      "style":"friendly"
   }
]
Run Code Online (Sandbox Code Playgroud)

期望的输出

[  
       {  
          "id":1,
          "url":"http://192.168.28.131:8000/snippets/1/",
          "title":"",
          "code":"foo = \"bar\"\n",
          "linenos":false,
          "language":"python",
          "style":"friendly"
       },

    ]
Run Code Online (Sandbox Code Playgroud)

Lou*_*iro 6

你必须使用HyperlinkedModelSerializer序列化器和HyperlinkedIdentityField字段

来自Django Rest Framework文档

HyperlinkedModelSerializer类相似,除了它使用超链接来表示的关系,而不是主键ModelSerializer类.url字段将使用HyperlinkedIdentityField序列化程序字段表示,并且模型上的任何关系将使用HyperlinkedRelatedField序列化程序字段表示 .

例如(与你的情况):

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')
Run Code Online (Sandbox Code Playgroud)

当然,view_namevalue必须与urls.py用于获取有关代码段的所有信息的(或其他地方)声明的url的名称相匹配.

例如:

# urls.py
urlpatterns = [
    url(r'^snippets/(?P<pk>[0-9]+)$', views.SnippetDetail.as_view(), name='snippet-detail'),
]
Run Code Online (Sandbox Code Playgroud)