如何使用 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')