一、序列化器,继承HyperlinkedModelSerializer,分别添加url以及highlighted字段,建立snippets = serializers.HyperlinkedRelatedField关系
class SnippetSerializer(serializers.HyperlinkedModelSerializer): owner = serializers.ReadOnlyField(source='owner.username') highlighted = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html') class Meta: model = Snippet fields = ('url', 'id', 'title', 'code', 'linenos', 'language', 'style', 'owner', 'highlighted') class UserSerializer(serializers.HyperlinkedModelSerializer): snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True) class Meta: model = User fields = ('url', 'id', 'username', 'snippets')
二、views当中添加单独的SnippetHighlight,这里是获取一个序列化器中的属性,而不是获取序列化。默认带一个url.不是返回对象实例,而是返回对象实例的属性。
from snippets.models import Snippet from snippets.serializers import SnippetSerializer,UserSerializer from rest_framework import generics from django.contrib.auth.models import User from snippets.permissions import IsOwnerOrReadOnly from rest_framework import permissions class SnippetList(generics.ListCreateAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer def perform_create(self, serializer): serializer.save(owner=self.request.user) permission_classes = (permissions.IsAuthenticatedOrReadOnly,) class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly,) class UserList(generics.ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer class UserDetail(generics.RetrieveAPIView): queryset = User.objects.all() serializer_class = UserSerializer from rest_framework.decorators import api_view from rest_framework.reverse import reverse from rest_framework import renderers, generics from rest_framework.response import Response #这里提供一个统一入口 @api_view(['GET']) def api_root(request, format=None): return Response( { 'users': reverse('user-list', request=request, format=format), 'snippets': reverse('snippet-list', request=request, format=format) } ) class SnippetHighlight(generics.GenericAPIView): queryset = Snippet.objects.all() renderer_classes = (renderers.StaticHTMLRenderer,) def get(self, request, *args, **kwargs): snippet = self.get_object() return Response(snippet.highlighted)