DRF--view

在学django的时候,我们写视图是这样的

复制代码
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


@csrf_exempt  # 这个函数可以跨域访问
def snippet_list(request):
    if request.method == 'GET':  # get请求
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)  # 序列化
        return JsonResponse(serializer.data, safe=False)

    if request.method == 'POST':  # post请求
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(data=data)  # 序列化
        if serializer.is_valid():  # 验证序列化
            serializer.save()  # 保持数据
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)


@csrf_exempt
def snippet_detail(request, pk):  # 获取单个数据
    try:
        snippet = Snippet.objects.get(pk=pk)  # ORM的模型的对象,一个
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':  # 获取单个数据
        serializer = SnippetSerializer(snippet)
        return JsonResponse(serializer.data)

    if request.method == 'PUT':  # 修改单个数据
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    if request.method == 'DELETE':  # 删除单个数据
        snippet.delete()
        return HttpResponse(status=204)
复制代码

第二版

复制代码
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


@api_view(['GET', "POST"])  # get和post可以访问
def snippet_list(request, format=None):
    if request.method == 'GET':  # get对应的方法,获取全部数据
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)

    if request.method == 'POST':  # post对应的方法
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():  # validated_data
            serializer.save()  # ORM,保存到数据库中
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'PUT', 'DELETE'])  # 获取单个数据,put,delete对应的方法
def snippet_detail(request, pk, format=None):
    try:
        snippet = Snippet.objects.get(pk=pk)  # ORM的模型的对象,一个
    except Snippet.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':  # 获取单条数据
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    if request.method == 'PUT':  # 修改数据
        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)

    if request.method == 'DELETE':  # 删除数据
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
复制代码

第三版,使用APIView

复制代码
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):  # 继承APIView

    def get(self, request, format=None):  # get请求获取所有数据
        snippets = Snippet.objects.all()  # 查询数据
        serializer = SnippetSerializer(snippets, many=True)  # 序列化
        return Response(serializer.data)

    def post(self, request, format=None):  # post请求
        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:
            snippet = Snippet.objects.get(pk=pk)  # ORM的模型的对象,一个
            return snippet
        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)
复制代码

第四版,混入mixin

复制代码
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins  # 导入mixins
from rest_framework import generics  # 导入generics


# ListModelMixin获取所有数据,CreateModelMixin创建数据
class SnippetList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Snippet.objects.all()  # filter()
    serializer_class = SnippetSerializer  # 序列化对象

    def get(self, request, *args, **kwargs):
        # 调用ListModelMixin下的list方法,获取所有数据
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        # 调用CreateModelMixin下的create方法,添加数据
        return self.create(request, *args, **kwargs)



# RetrieveModelMixin获取单条数据,UpdateModelMixin修改数据,DestroyModelMixin删除数据
class SnippetDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    queryset = Snippet.objects.all()  # filter()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        # 调用RetrieveModelMixin下的retrieve方法,获取单条数据
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        # 调用UpdateModelMixin下的update方法,修改数据
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        # 调用DestroyModelMixin下的destroy方法,删除数据
        return self.destroy(request, *args, **kwargs)
复制代码

第五版,上面的在简化

复制代码
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics
from rest_framework import permissions
from snippets.permissions import IsOwnerOrReadOnly



# generics.ListCreateAPIView继承了mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView
# 获取所有数据(List),添加数据(Create)
class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)


# generics.RetrieveUpdateDestroyAPIView继承了mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin
# 获取单个数据(Retrieve),修改数据(Update),删除数据(Destroy)
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    # 当获取单个数据,修改数据,删除数据的时候,就去父类RetrieveUpdateDestroyAPIView找
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
复制代码
posted @   邹邹很busy。  阅读(212)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2019-06-09 django -- web框架的本质
2019-06-09 postman使用--发送请求
点击右上角即可分享
微信分享提示