DRF--view

简介: 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

相关文章
|
存储 数据采集 Java
InfluxDB 的学习笔记
在Java项目中实现InfluxDB的落地应用,主要包括添加InfluxDB的Java客户端依赖、创建数据库连接、执行数据的增删改查操作等步骤
797 2
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
279 5
Java循环操作哪个快?
|
11月前
|
安全 测试技术
更睿智的看世界!实测阿里首个多模态视觉推理模型QVQ-72B-Preview
阿里通义千问Qwen团队于12月25日推出首个开源视觉推理模型QVQ-72B-Preview,该模型在数学、物理、化学等领域表现出色,在MMMU基准测试中得分70.3,超越Qwen2-VL-72B-Instruct。尽管在部分任务如立体图形计数上存在局限性,QVQ-72B-Preview仍展示了强大的视觉理解和推理能力。模型目前仅支持单轮对话和图像输出,不支持视频输入。地址:https://modelscope.cn/studios/Qwen/QVQ-72B-preview
|
数据采集 安全 网络安全
提高企业进入国外市场的“免疫力”——阿里云CDN安全能力分析
提高企业进入国外市场的“免疫力”——阿里云CDN安全能力分析
|
索引 Python 容器
Pandas 2.2 中文官方教程和指南(十五)(3)
Pandas 2.2 中文官方教程和指南(十五)
125 1
|
Ubuntu Linux PHP
Ubuntu 17.10安装phpMyAdmin数据库管理工具
Ubuntu 17.10安装phpMyAdmin数据库管理工具
233 6
|
安全 搜索推荐 算法
网站使用SSL证书的重要性
网站使用SSL证书的重要性
|
算法 定位技术 C++
【兔年之兔子走迷宫】 用一个小游戏对回溯法进行实现 | C++
简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。
789 6
【兔年之兔子走迷宫】 用一个小游戏对回溯法进行实现 | C++
惊艳!腾讯强推599页Netty进阶神技,完美诠释Netty
作为一个学Java的,如果没有研究过Netty,那么你只能算一个初等Java程序员。如果你想知道Nginx是怎么写出来的,如果你想知道Tomcat和Jetty是如何实现的,如果你想实现一个简单的Redis服务器,那都应该好好理解一下Netty,如果你要进阶,想了解Java服务器的深层高阶知识,Netty也绝对是一个必须要过的门槛。
|
Java 应用服务中间件 开发工具
IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...(上)
IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...(上)
IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...(上)

热门文章

最新文章