• django基于restframework的CBV封装


    一.models数据库映射

    from django.db import models
    
    # Create your models here.
    class Book(models.Model):
        title=models.CharField(max_length=32)
        price=models.IntegerField()
        pub_date=models.DateField()
        publish=models.ForeignKey(to="Publish")
        authors=models.ManyToManyField(to="Author")
        def __str__(self):
            return self.title
    
    class Publish(models.Model):
        name=models.CharField(max_length=32)
        email=models.EmailField()
        def __str__(self):
            return self.name
    
    class Author(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField()
        def __str__(self):
            return self.name

    二.serializers序列化

    from rest_framework import serializers
    from app01 import models
    from rest_framework import exceptions
    
    
    class BookSerialize(serializers.ModelSerializer):
        class Meta:
            model = models.Book
            fields = "__all__"
    
        publish = serializers.SerializerMethodField()
        authors = serializers.SerializerMethodField()
    
        def get_publish(self, obj):
            return {"publish_id": obj.publish.pk, "publish_name": obj.publish.name}
    
        def get_authors(self, obj):
            author_list = obj.authors.all()
            lis = [{"name": author.name, "age": author.age} for author in author_list]
            return lis
    
        def validate_title(self, value):
            if value.startswith("sb"):
                raise exceptions.ValidationError('你使用了不合适的文字')
            return value

    三.url路由

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^books/$', views.Books.as_view()),
    ]

    四.Views视图类

    主要就是将CBV的几个get,post请求方法进行封装,以后创建其他的新的CBV,直接继承调用就可以了,可以减少代码冗余

    from app01 import models
    from rest_framework.response import Response
    from rest_framework.views import APIView
    from app01.serialize_module import BookSerialize
    
    # 自定义一个response类,方便CBV使用
    class MyResponse():
        def __init__(self):
            self.status = 100
            self.msg = None
    
        # 将类方法装饰成属性
        @property
        def get_dic(self):
            return self.__dict__
    
    
    # 封装CBV类
    # 将get请求封装在List类中
    class List():
        def get_list(self, request,*args,**kwargs):
            response = MyResponse()
            try:
                handler_list = self.model.objects.all()
                handler_ser = self.serializer(instance=handler_list, many=True)
                response.handler = handler_ser.data
                response.msg = "获取成功"
            except Exception as e:
                response.msg="获取失败"
                response.error=str(e)
            return Response(response.get_dic)
    
    # 将post请求封装在Create类中
    class Create():
        def save(self, request,*args,**kwargs):
            response = MyResponse()
            try:
                handler_ser = self.serializer(data=request.data)
                if handler_ser.is_valid():
                    handler_ser.save()
                    response.msg = "添加成功"
                else:
                    response.status = 101
                    response.msg = "添加失败"
                    response.error = handler_ser.errors
            except Exception as e:
                response.msg = "添加失败"
                response.error=str(e)
            return Response(response.get_dic)
    
    # book类继承List,Create,APIView
    class Books(List,Create,APIView):
        model=models.Book
        serializer=BookSerialize
        # 此时调用get方法时,只要使用List类中的get_list方法就行了
        def get(self,request):
            return self.get_list(request)
    
        # 此时调用post方法时,只要使用Create类中的save方法就行了
        def post(self,request):
            return self.save(request)
  • 相关阅读:
    Glide优化
    Java多线程知识点
    Android知识点
    Gradle的一些技巧和遇到的问题
    Python用Django写restful api接口
    Python写爬虫爬妹子
    用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式
    【Python】扫描指定文件夹下特定后缀的文件
    【Python】生成多级树结构的xml文件
    【转】【Linux】安装pyinstaller
  • 原文地址:https://www.cnblogs.com/angelyan/p/10433100.html
Copyright © 2020-2023  润新知