解决Django中多条件查询的问题


Posted in Python onJuly 18, 2019

tags: django中对条件查询

一些cms项目都会使用到多条件查询,我们后端如何处理请求的条件呢?

满足一个条件

满足两个条件

满足多个条件

………………….

这样处理起来会非常的恼火. 其实有多方法比如(传参数,传字典,传Q对象,传F对象…)陷入深深的思考中…怎么用做简单的方法把这个需求解决了.

个人觉得.把我们的查询的所有条件来构建一个字典来查询起来比较高效.具体如何操作见下面的代码:

视图函数.

def order_list(request):
  
  if request.method == 'GET':
    return render(request, 'admin/order_list.html')

  if request.method == 'POST':
    # 获取案件号
    case_order = request.POST.get('case_order')
    # 获取客户姓名
    case_name = request.POST.get('case_name')
    # 获取身份证号码
    idno = request.POST.get('idno')
    # 获取贷款日期
    loan_date = request.POST.get('loan_date')
    # 获取贷款状态
    state = request.POST.get('state')
    # 获取贷款类型
    dk_type = request.POST.get('dk_type')

    # 定一个字典用于保存前端发送过来的查询条件
    search_dict = dict()
    # 如果有这个值 就写入到字典中去
    if case_order:
      search_dict['loan_id'] = case_order
    if case_name:
      search_dict['name'] = case_name
    if idno:
      search_dict['user_card'] = idno
    if loan_date:
      search_dict['pri_date'] = loan_date
    if state:
      # 通过关联关系查询出来需要的数据
      state_info = StatuTable.objects.filter(statu_name=state).first()

      search_dict['statu_id'] = state_info.statu_id
    if dk_type:
      loa = LoantypeTable.objects.filter(loan_name=dk_type).first()
      search_dict['loa_loan_id'] = loa.loan_id

    # 多条件查询 关键点在这个位置传如的字典前面一定要加上两个星号.
    user_order_info = UserTable.objects.filter(**search_dict)
    # 序列化
    data_info = [user_order.to_dict() for user_order in user_order_info]

    data = {
      'code': 200,
      'data_info': data_info
    }
    return JsonResponse(data)

Models见上一篇文章

传送门 Model

前端html页面

<head>
  // 使用jquery就必须引入
	<script src="/static/admin/js/jquery.js" type="text/javascript"></script>
  // 需要使用ajaxSubmit去提交表单就必须引入
  <script src="/static/admin/js/jquery.form.min.js" type="text/javascript"></script>
  // 使用template.js渲染页面就必须引入
  <script src="/static/admin/js/template.js" type="text/javascript"></script>
  <script src="/static/admin/js/order_list.js" type="text/javascript"></script>
</head>

<div class="wrap">
  <div class="page-title">
    <span class="modular fl"><i class="order"></i><em>查询还款案件</em></span>
  </div>
  <div class="operate">
    <form id="search-order">
      {% csrf_token %}
      <div>
        <div style="margin: 10px">
          <label for="">客户单号:</label>
          <input type="text" class="textBox length-long " name="case_order" value=""/>

          <label for="">客户名称:</label>
          <input type="text" class="textBox length-long " name="case_name" value=""/>
        </div>

        <div style="margin: 10px">
          <label for="">身份证号:</label>
          <input type="text" class="textBox length-long " name="idno" value=""/>

          <label for="">贷款日期:</label>
          <input type="text" class="textBox length-long" id="datepicker" name="loan_date" value=""/>
        </div>

        <div style="margin: 10px">
          <label for="">处理状态:</label>
          <select class="inline-select textBox length-long" name="state">
            <option value="未处理">未处理</option>
            <option value="已处理">已处理</option>
          </select>
          <label for="">贷款项目:</label>
          <select class="inline-select textBox length-long" name="dk_type">
            <option value="POS贷">POS贷</option>
            <option value="现金贷">现金贷</option>
          </select>
          <div style="margin-right: 20px;margin-top: 10px;">
            <input type="submit" value="查询" class="tdBtn"/>
          </div>
        </div>
      </div>
    </form>
  </div>

  <table class="list-style Interlaced" id="test">
    <tr>
      <th>申请编号</th>
      <th>客户名称</th>
      <th>联系方式</th>
      <th>身份证号码</th>
      <th>办理日期</th>
      <th>处理人</th>
      <th>处理状态</th>
      <th>处理时间</th>
      <th>操作</th>
    </tr>
    {% verbatim %}
    <script type="text/html" id="tr_list">
      {{ each users as user }}
      <tr>
        <td>
          <input type="checkbox"/>
          <a href="/admin/order_detail/?id={{ user.user_id }}" rel="external nofollow" rel="external nofollow" style="text-decoration:underline; color: blue">
            <span>{{ user.loan_id }}</span>
          </a>
        </td>
        <td class="center">
          <span class="block">{{ user.name }}</span>
        </td>
        <td width="200" style="text-align:center">
          <span class="block">{{ user.phone }}</span>
        </td>
        <td class="center">
          <span>{{ user.card }}</span>
        </td>
        <td class="center">
          <span>{{ user.date }}</span>
        </td>
        <td class="center">
          <span>{{ user.deal_peo }}</span>
        </td>
        <td class="center">
          <span>{{ user.status }}</span>
        </td>
        <td class="center">
          <span>{{ user.deal_time }}</span>
        </td>
        <td class="center">
          <a href="/admin/order_detail/?id={{ user.user_id }}" rel="external nofollow" rel="external nofollow" class="inline-block" title="查看案件"><img
              src="/static/admin/images/icon_view.gif"/></a>
          <a class="inline-block" title="删除案件">
            <img src="/static/admin/images/icon_trash.gif"/>
          </a>
        </td>
      </tr>
      {{ /each }}
    </script>
    {% endverbatim %}
  </table>
  <!-- BatchOperation -->
  <div style="overflow:hidden;">
    <!-- Operation -->
    <div class="BatchOperation fl">
      <input type="checkbox" id="del"/>
      <label for="del" class="btnStyle middle">全选</label>
      <a href="/admin/export_excel/" rel="external nofollow" ><button id="export_excel" type="button" class="btnStyle" >导出excel</button></a>
      <input type="button" value="删除案件" class="btnStyle"/>
    </div>

后端搞定了就可以在前端写ajax去渲染页面了.

$(function () {
  var token = $(':input[name="csrfmiddlewaretoken"]').val()
  $('#search-order').submit(function () {
    $(this).ajaxSubmit({
      url: '/admin/order_list/',
      dataType: 'json',
      type: 'POST',
      headers: {'X-CSRFToken': token},
      success: function (data) {
        if (data.code == 200) {
          var html ='<tr>\n' +
            '      <th>申请编号</th>\n' +
            '      <th>客户名称</th>\n' +
            '      <th>联系方式</th>\n' +
            '      <th>身份证号码</th>\n' +
            '      <th>办理日期</th>\n' +
            '      <th>处理人</th>\n' +
            '      <th>处理状态</th>\n' +
            '      <th>处理时间</th>\n' +
            '      <th>操作</th>\n' +
            '    </tr>'

          var tr_html = template('tr_list', {users: data.data_info})
          html += tr_html
          $('#test').html(html)
        }
      }
    })
    // 阻止默认提交
    return false;
  })
})

总结:

重点就在怎么构建字典后最后构建好的字段如何传参的问题.

以上这篇解决Django中多条件查询的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决Python requests 报错方法集锦
Mar 19 Python
python3连接MySQL数据库实例详解
May 24 Python
python3实现名片管理系统
Nov 29 Python
Python3中exp()函数用法分析
Feb 19 Python
python实现二分类的卡方分箱示例
Nov 22 Python
Python OpenCV视频截取并保存实现代码
Nov 30 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
Python 动态变量名定义与调用方法
Feb 09 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
python如何保存文本文件
Jun 07 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
Python中使用Lambda函数的5种用法
Apr 01 Python
python openpyxl使用方法详解
Jul 18 #Python
Python Django基础二之URL路由系统
Jul 18 #Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 #Python
Django基础三之视图函数的使用方法
Jul 18 #Python
详解python实现小波变换的一个简单例子
Jul 18 #Python
Django基础知识 URL路由系统详解
Jul 18 #Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 #Python
You might like
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
实例讲解python函数式编程
2014/06/09 Python
python正则表达式中的括号匹配问题
2014/12/14 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
Python 求向量的余弦值操作
2021/03/04 Python
苹果香港官方商城:Apple香港
2016/09/14 全球购物
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
国庆节演讲稿
2014/05/27 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL