Django REST Framework 数码宝贝 - 3步进化 - 混合类 -->

  读了我这篇博客, 你会刷新对面对对象的认知, 之前的面对对象都是LJ~~~

表结构

class Publisher(models.Model):
    name = models.CharField(max_length=32)

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=32)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=32)
    pub_date = models.DateField()
    CHOICES = ((1, ‘Python‘), (2, ‘Go‘), (3, ‘linux‘))
    category = models.IntegerField(choices=CHOICES)
    publisher = models.ForeignKey(to=‘Publisher‘, on_delete=models.CASCADE)
    authors = models.ManyToManyField(to=‘Author‘)

    def __str__(self):
        return self.title

 原路由:

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^books/$‘, views.BookListView.as_view()),
    url(r‘book/(?P<pk>\d+)$‘, views.BookDetailView.as_view()),

    url(r‘^publishers/$‘, views.PublisherView.as_view()),
    url(r‘publishers/(?P<pk>\d+)$‘, views.PublisherDetailView.as_view()),

]


原始版:

  获取出版社信息  

# 获取出版社信息
class PublisherView(APIView):
    """使用Django REST framework 内置的序列化"""

    def get(self,request):
        """Json格式返回所有的书籍信息"""
        queryset = models.Publisher.objects.all()
        ser_obj = ModelPublisherSerlizer(queryset, many=True)
        return Response(ser_obj.data)

    def post(self, request):
        ser_obj = ModelPublisherSerlizer(data=request.data)
        if ser_obj:
            ser_obj.save()
            return Response(‘ok‘)
        else:
            return Response(ser_obj.errors)

  获取具体某个出版社信息 查 改 删 -- > 

# 获取具体某个出版社信息
class PublisherDetailView(APIView):

    def get(self,pk):
        publisher_ob = models.Publisher.objects.filter(pk=pk)
        publisher_obj = models.Publisher.objects.filter(pk=pk).first()
        print("publisher_ob", publisher_ob, "publisher_obj", publisher_obj)

        if publisher_obj:
            ser_obj = ModelPublisherSerlizer(publisher_obj)
            return Response(ser_obj.data)
        else:
            return Response("无效的id")

    def put(self, request, pk):
        publisher_obj = models.Publisher.objects.filter(pk=pk).first()

        if publisher_obj:
            ser_obj = ModelPublisherSerlizer(instance=publisher_obj, data=request.data, partial=True)
            if ser_obj.is_valid():
                ser_obj.save()
                return Response(ser_obj.data)
            else:
                return Response(ser_obj.errors)
        else:
            return Response("没有这本书")

    def delete(self,pk):
        publisher_obj = models.Publisher.objects.filter(pk=pk)

        if publisher_obj:
            publisher_obj.delete()
            return Response("删除成功")
        else:
            return Response("没有这本书")


进化版:

  把出版社相关信息封装起来

class CemericView(APIView):
    """视图中可能用到的配置和方法封装起来"""
    queryset = None
    serializer_class = None

    def get_queryset(self):
        # 让每次请求来的时候都先查一次数据
        return self.queryset.all()

class ListMinxin(object):
    def get(self, request):
        queryset = self.get_queryset()
        ser_obj = self.serializer_class(queryset, many=True)
        return Response(ser_obj.data)

class CreateMixin(object):
    def post(self, request):
        ser_obj = self.serializer_class(data=request.data)
        if ser_obj:
            ser_obj.save()
            return Response(‘ok‘)
        else:
            return Response(ser_obj.errors)

# 获取出版社信息
class PublisherView(CemericView, ListMinxin, CreateMixin):

    queryset = models.Publisher.objects.all()
    serializer_class = ModelPublisherSerlizer


 

超级进化版:

  把某个出版社的信息也封装起来

class GemericView(APIView):
    """视图中可能用到的配置和方法封装起来"""
    queryset = None
    serializer_class = None

    def get_queryset(self):
        # 让每次请求来的时候都先查一次数据
        return self.queryset.all()

    def get_obj(self, request, pk, *args, **kwargs):
        return self.get_queryset().filter(pk=pk).filter(pk=pk).first()
class ListMinxin(object):
    def get(self, request):
        queryset = self.get_queryset()
        ser_obj = self.serializer_class(queryset, many=True)
        return Response(ser_obj.data)

class CreateMixin(object):
    def post(self, request):
        ser_obj = self.serializer_class(data=request.data)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(‘ok‘)
        else:
            return Response(ser_obj.errors)

# 获取出版社信息
class PublisherView(GemericView, ListMinxin, CreateMixin):

    queryset = models.Publisher.objects.all()
    serializer_class = ModelPublisherSerlizer

class RetrieveMixin(object):
    def get(self, request, pk, *args, **kwargs):
        obj = self.get_obj(request, pk, *args, **kwargs)
        if obj:
            ser_obj = self.serializer_class(obj)
            return Response(ser_obj.data)
        else:
            return Response("无效的id")

class UpdateMixin(object):
    def put(self, request, pk, *args, **kwargs):
        obj = self.get_obj(request, pk, *args, **kwargs)

        if obj:
            ser_obj = ModelPublisherSerlizer(instance=obj, data=request.data, partial=True)
            if ser_obj.is_valid():
                ser_obj.save()
                return Response(ser_obj.data)
            else:
                return Response(ser_obj.errors)
        else:
            return Response("没有这本书")

class DelMixin(object):
    def delete(self, request, pk, *args, **kwargs):
        obj = self.get_obj(request, pk, *args, **kwargs)
        print(obj)
        # print(obj.filter(pk = pk))

        if obj:
            obj.delete()
            return Response("删除成功")
        else:
            return Response("没有这本书")

# 获取具体某个出版社信息
class PublisherDetailView(GemericView, RetrieveMixin, UpdateMixin, DelMixin):
    queryset = models.Publisher.objects.all()
    serializer_class = ModelPublisherSerlizer

  如果在写一个api 的话 只需要3行代码, 

    但是 封装的代码好像有点多, 继承关系有点乱,

      其实框架本身提供了内置方法, 

from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin

注意: 单纯的导入 不能成功, 因为 此方法中不是以 get ,post 等命名的, 导致 MVC模型中 as.view(), 找不到 请求的方式, 需要 对 这些方法进行进一步封装

 就有了下面的内置方法

from rest_framework.generics import ListCreateAPIView,RetrieveDestroyAPIView

#这个包里里面 封装了 各种用于API 开发的浏览器 请求方式, 及组合方式, 直接调用即可

  一共 7行 代码解决

from rest_framework.generics import ListCreateAPIView, RetrieveDestroyAPIView

# 获取出版社信息
class PublisherView(ListCreateAPIView):

    queryset = models.Publisher.objects.all()
    serializer_class = ModelPublisherSerlizer

# 获取具体某个出版社信息
class PublisherDetailView(RetrieveDestroyAPIView):
    queryset = models.Publisher.objects.all()
    serializer_class = ModelPublisherSerlizer


究极进化版:

  上面超级进化版 一张表要写两个视图 定义queryset和serializer_class 重复,

  而且  路由也需要重复, 显然, 究极进化是不允许的~~

  

    重写了as_view()方法,实现了根据请求的方法执行具体的类方法

   路由注册的时候,利用actions参数,实现路由的定向分发 而不是简单的 反射

url(r‘authors/$‘, views.AuthorViewSet.as_view(actions={‘get‘: ‘list‘, ‘post‘: ‘create‘})),  # 作者列表
url(r‘authors/(?P<pk>\d+)/$‘, views.AuthorViewSet.as_view(
        actions={‘get‘: ‘retrieve‘, ‘put‘: ‘update‘, ‘delete‘: ‘destroy‘})
        ),  # 作者详情   

    路由都重复写两条:

   还可以利用内置的DefaultRouter来实现路由的注册

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(‘authors‘, views.AuthorViewSet)

urlpatterns += router.urls
from rest_framework.viewsets import ModelViewSet
class AuthorViewSet(ModelViewSet):
    """
        list()
        create()
        retrieve()
        update()
        destroy()

    """
    queryset = models.Author.objects.all()
    serializer_class = AuthorModelSerializer

总结:  

  建议用以下两种方式

原文地址:https://www.cnblogs.com/konghui/p/10268393.html

时间: 2024-08-01 14:37:45

Django REST Framework 数码宝贝 - 3步进化 - 混合类 -->的相关文章

DRF(Django REST Framework)框架

目录 一.DRF中的Request 二.前戏: 关于面向对象的继承 三.初级版本 1. settings.py文件 -- 注册app 2. models.py文件 -- 创建表 3. admin.py文件 4. 根目录下urls.py -- 路由匹配 5. bms/views.py -- 视图函数 6. bms/modelserializers.py -- 自定义序列化工具 四.进化版: 使用自定义混合类和自定义通用类 五.超级进化版: 使用GenericViewSet通用类 六.究极进化版:

Django REST framework - 权限和限制

目录 Django REST framework 权限和限制 (你能干什么) 设置权限的方法 案例 第一步: 定义一个权限类 第二步: 使用 视图级别 全局级别设置 --- 限制 (你一分钟能干多少次?)**好像有点污~~ ### 第一步: 自定义限制类 第二步: 使用 嫌麻烦的话,还可以使用内置限制类,哈哈~ Django REST framework 权限和限制 (你能干什么) 与身份验证和限制一起,权限确定是应该授予还是拒绝访问请求. 在允许任何其他代码继续之前,权限检查始终在视图的最开始

Django REST framework视图

Django REST framework视图 学习序列化的时候发现有大量的冗余代码,所以我们要使用Django REST framework里的视图减少我们的代码 DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Django中的request从request.GET中获取URL参数,从request.POST中取某些情况下的POST数据. 在API

利用 Django REST framework 编写 RESTful API

利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framework 真乃一大神器,可以轻易的甚至自动化的搞定很多事情,比如: 自动生成符合 RESTful 规范的 API 支持 OPTION.HEAD.POST.GET.PATCH.PUT.DELETE 根据 Content-Type 来动态的返回数据类型(如 text.json) 生成 browserable

Python【第二十四课】Django rest framework

本节内容 Django rest framework 安装 Django rest framwwork 环境配置 简单举例说明 Django中使用 rest framework 1.1 安装 Django rest framework 建立新的环境 virtualenv env source env/bin/activate 安装 djangorestframework 模块 pip install django pip install djangorestframework pip insta

Django REST Framework剖析

一.简介 Django REST Framework(简称DRF),是一个用于构建Web API的强大且灵活的工具包. 先说说REST:REST是一种Web API设计标准,是目前比较成熟的一套互联网应用程序的API设计理论. Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写.我对这个词组的翻译是"表现层状态转化".如果一个架构符合REST原则,就称它为RESTful架构.所以简单来说,RESTful是一

Django REST framework 之JWT认证

Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名.它具备两个特点: 简洁(Compact) 可以通过URL, POST 参数或者在 HTTP header 发送,因为数据量小,传输速度快 自包含(Self-contained) 负载中包含了所有用户所需要的信息,避免了多次查询数据库 2.JWT 组成

Django REST framework序列化

Django REST framework序列化 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式 models部分 from django.db import models class Book(models.Model): title = models.CharField(max_length=32) price = models.IntegerField() pub_date = models.DateFie

引爆潮流技术 Vue+Django REST framework打造生鲜电商项目

引爆潮流技术Vue+Django REST framework打造生鲜电商项目 1.Django REST framework框架介绍 Django REST framework框架是一个功能强大且灵活的工具包,用于构建Web API,且Django Rest Framework 是 Django 依赖扩展 Restful Api 的框架,与Django的使用风格类似,它的官方网站是:https://www.django-rest-framework.org/ 2.设计API 我们先选择一个AP