zoukankan      html  css  js  c++  java
  • django接口开发-代码优化views_get,urls

    #利用cbv的继承特性,进行views中代码优化

    #把views中的代码拆出来,新建custom_view.py,把cbv-class从views中挪进去

    #自定义view,custom_view.py中新建一个BaseView 用于定义条件变量
    import datetime
    from itertools import chain
    
    from django.core.paginator import Paginator
    from django.db.models import Model
    from django.http import JsonResponse
    from django.views import View
    from example import models
    
    def model_to_dict(instance, fields=None, exclude=None):
        opts = instance._meta
        data = {}
        for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
            if fields and f.name not in fields:
                continue
            if exclude and f.name in exclude:
                continue
            value = f.value_from_object(instance)
            if isinstance(value, datetime.datetime):
                value = value.strftime('%Y-%m-%d %H:%M:%S')
            if isinstance(value, datetime.date):
                value = value.strftime('%Y-%m-%d')
            data[f.name] = value
        return data
    
    #BaseView中定义条件变量
    class BaseView(View):
        model_class = None   #1-传递类变量
        fields = []          #2-返回指定字段
        exclude_fields = []  #3-指定返回时过滤掉哪些字段
        filter_fields = []  #4-按照什么字段进行过滤
        search_fields = []  #5-按照什么字段进行模糊匹配,前端传key=search的字段
    
        #1-验证model_clsss不传的时候
        @property
        def model(self):
            #issubclass:参数1是不是参数2的子类,校验model_class
            if self.model_class and issubclass(self.model_class,Model):
                return self.model_class
            raise Exception("未定义model_class")
    
        def get_filter_dict(self):
            filter_dict = {}
            for filed in self.filter_fields:
                #通过request取到name值
                value = self.request.GET.get(filed)
                if value:
                    filter_dict[filed] = value
            return filter_dict
    
        def get_search_dict(self):   #只能模糊查询一个字段
            search_dict = {}
            value = self.request.GET.get('search')
            if value:
                search_dict = {"%s__contains" %self.search_fields[0]:value}
            return search_dict
    def get_search_dict2(self): #实现多个字段模糊匹配,字段间是or的关系
    q = Q() #Q,什么条件都没有
    value = self.request.GET.get('search')
    if value:
    for filed in self.search_fields:
    d ={"%s__contains" %filed:value}
    q = Q(**d) |q
    return q
    #把复用接口方法变成共用方法, class GetView(BaseView): def get(self,requests): # get请求时 获取传递过来的第几页数据 page = requests.GET.get('page') filter_dict = self.get_filter_dict() search_dict = self.get_search_dict()
    search_q = self.get_search_dict2()
    #增加过滤条件,获取查询结果 qs = self.model_class.bojects.filter(is_delete=0).filter(filter_dict).filter(**search_dict).filter(search_q) page_obj = Paginator(qs, 5) # 获取第几页的数据 page_data = page_obj.get_page(page) # 用于存储返回的dict类型数据 data_list = [] for data in page_data: # 通过 model_to_dict转换成dict,exclude过滤哪些字段 tmp_data = model_to_dict(data, fields=self.fields,exclude=self.exclude_fields) data_list.append(tmp_data) return JsonResponse({"code": 0, "data": data_list})

    #老的views中只需传入条件:

    from .custom_view import GetView
    
    #简化代码 ,继承
    class SParameter(GetView):
        model_class = models.Parameter   #1-重写类变量,指定操作的数据
        fields = ['name']                #2-指定返回name字段
        exclude_fields = ['name']        #3-返回字段过滤掉name字段
        filter_fields = ['name']         #4-按照name进行过滤
        search_fields = ['name']         #5-按照name进行模糊匹配

    #urls优化,在子项目下创建一个urls.py

     #url优化(CBV),在路由访问时,请求的是指向的类中的方法, get请求就访问def get、post请求进来就访问def post

    #子urls引用custom_views逻辑
    from
    django.urls import path from .views import f_parameter,SParameter urlpatterns = [ # fbv path('f_parameter', f_parameter), # cbv # path('c_parameter', Parameter.as_view()), # 优化代码后cbv路由 path('s_parameter', SParameter.as_view()), ]

    #老urls中再引用子项目下的urls

    from django.urls import path,include
    from example import urls
    
    urlpatterns = [
    
        #通过include 将其他app的路由导入进来
        #api是base目录,每个example当中的路由都会加上api/
        path('api/',include(urls)),
    ]
  • 相关阅读:
    [币严区块链]数字货币交易所之比特币(BTC)钱包对接 | 自建节点JSON-RPC访问
    [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏
    一句话的设计模式
    在线捉鬼游戏开发
    华容道程序求解
    利用多态,实现一般处理程序(ashx)中的AOP(切面编程)
    客户端-服务器端互动比较与原生实例(比较ajax,server-sent event,websocket/netsocket)
    在线捉鬼游戏开发之三
    在线捉鬼游戏开发之三
    在线捉鬼游戏开发之三
  • 原文地址:https://www.cnblogs.com/whcp855/p/13634278.html
Copyright © 2011-2022 走看看