Django-Rest-Framework第三级别和第四级别

Django-Rest-Framework 第三级别

一. 拷贝 第二级别的项目过来

https://github.com/Ran-oops/DRF_Project3.git

复制DRF_Project3里面的全部文件到新的文件夹DRF_Project4里面。

二. 对以下文件进行修改

(一.一) snippets/views.py 第一种版本(类视图)

现在我们把函数式视图变为类视图

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status


class SnippetList(APIView):
    """
    列表和创建
    """
    def get(self, request, format=None):
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
class SnippetDetail(APIView):
    """
    详情,修改和删除
    """
    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

注: 因为是类视图,所以继承APIView

(一.二) snippets/views.py 第二种版本(使用mixins)

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics

class SnippetList(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class SnippetDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)
  1. 如果不想要哪个功能,可以删除对应的mixin,比如不想要创建功能,可以去掉mixins.CreateModelMixin。 不想要列表功能,可以去掉mixins.ListModelMixin。 但是generics.GenericAPIView是核心实现,一般不可以去掉。
  2. 如果不想要更新功能,可以去掉mixins.UpdateModelMixin,以此类推。

(一.三) snippets/views.py 第三种版本(通用类视图)

​ 这种版本是我们推荐使用的,因为很简洁,很方便

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics


class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer


class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
  1. 对于ListCreateAPIView, 如果不想要显示列表,可以去掉List,变成generics.CreateAPIView。 同样,如果不想要创建功能,可以去掉Create变成generics.ListAPIView

  2. 对于generics.RetrieveUpdateDestroyAPIView,RetrieveUpdateDestroy可以删掉其中的任意一个,也可以全保留,全看自己的需求进行改造:generics.RetrieveDestroyAPIView这样就去掉了更新功能,依此类推。

三种版本的views.py选用一种版本,为了学习起见,每一种版本都分别尝试一遍,实现的结果是一样的。

(二) snippets/urls.py

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

# 因为是类视图,所以这里需要使用as_view()
urlpatterns = [
    path('snippets/', views.SnippetList.as_view()),
    path('snippets/<int:pk>/', views.SnippetDetail.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

第三级别项目完成,启动项目访问http://127.0.0.1:8000/snippets/

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三级别,第四级别和第五级别之间的差别主要是views.py的不同。
采用第三种版本(通用类视图)是django-rest-framework的第四级别。这是我们最常使用的级别,方便简洁并且能更好地定制化。

ps:

代码地址奉上: https://github.com/Ran-oops/DRF_Project4.git

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值