专栏首页从零开始学自动化测试python测试开发django-78.ORM查询之extra

python测试开发django-78.ORM查询之extra

前言

Django 的查询语法难以简单的表达复杂的 WHERE 子句,对于对于这种情况, Django 提供了 extra() 方法。 extra() 能在 QuerySet 生成的SQL从句中注入新子句,这样可以完成复制的查询。

extra()

extra 方法的源码在 models/query.py 查看

    def extra(self, select=None, where=None, params=None, tables=None,
              order_by=None, select_params=None):
        """Add extra SQL fragments to the query."""
        assert self.query.can_filter(), \
            "Cannot change a query once a slice has been taken"
        clone = self._chain()
        clone.query.add_extra(select, select_params, where, params, tables, order_by)
        return clone

select 参数

select参数可以让你在 SELECT 从句中添加其他字段信息,它传一个字典

SELECT age, (age>15) as is_age FROM yoyo_personinfo;

is_age 返回的是一个布尔值

django查询的示例:

PersonInfo.objects.all().extra(select={‘is_age’: “age > 18”}).values(‘age’,’is_age’)

# 作者-上海悠悠 QQ交流群:717225969
MyDjango>python manage.py shell
>>> from yoyo.models import PersonInfo
>>>
>>> PersonInfo.objects.all().extra(select={'is_age': "age > 18"}).values('age','is_age')
<QuerySet [{'is_age': 1, 'age': 20}, {'is_age': 0, 'age': 11},
{'is_age': 1, 'age': 20}, {'is_age': 1, 'age': 20},
{'is_age': 0, 'age': 11}, {'is_age': 0, 'age': 11}]>

跟上面的查询效果是一样的

where 参数

可以使用 where 定义显式SQL WHERE子句,这样可以处理复杂的 WHERE 条件语句

SELECT * from yoyo_personinfo WHERE age in (20, 21) and name LIKE ‘yoyo%’;

django 查询的示例, where 传的是 list 类型参数:

>>> PersonInfo.objects.all().extra(where=["age in (20, 21) and name LIKE 'yoyo%%'"]).values("age", "name")
<QuerySet [{'age': 20, 'name': 'yoyo2'}, {'age': 20, 'name': 'yoyo4'}, {'age': 21, 'name': 'yoyo5'}]>
>>>

and 的多个条件也可以逗号分成多个参数 where=[“age in (20, 21)”, “name LIKE ‘yoyo%%’”])

>>> PersonInfo.objects.all().extra(where=["age in (20, 21)", "name LIKE 'yoyo%%'"]).values("age", "name")
<QuerySet [{'age': 20, 'name': 'yoyo2'}, {'age': 20, 'name': 'yoyo4'}, {'age': 21, 'name': 'yoyo5'}]>

table 参数

table 参数用于多表联合查询的时候,加到 FROM 后面 如果我想把2个表的数据查询结果放到一张表

使用 SQL 语句为

SELECT * from yoyo_card, yoyo_personinfo WHERE card_user=name;

查询的结果

django 查询的示例,table传list参数,可以是多个表名称,如:table=[‘yoyo_personinfo’]

Card.objects.all().extra(tables=[‘yoyo_personinfo’], where=[‘card_user=name’]).values()

# 作者-上海悠悠 QQ交流群:717225969
MyDjango>python manage.py shell
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from yoyo.models import Card,PersonInfo
>>>
>>> Card.objects.all().extra(tables=['yoyo_personinfo'], where=['card_user=name']).values()
<QuerySet [{'id': 2, 'card_id': '520000000001', 'card_user': 'yoyo2', 'add_time': datetime.datetime(2020, 6, 22, 22, 34, 14)},
{'id': 9, 'card_id': '800080007', 'card_user': 'yoyo3', 'add_time': datetime.datetime(2020, 6, 28, 22, 15, 34)}]>
>>>

params添参数

错误的方式 !!

first_name = 'Joe'  # 如果first_name中有SQL特定字符就会出现漏洞
Person.objects.all().extra(where=["first = '%s'" % first_name])

正确方式

Person.objects.all().extra(where=["first = '%s'"], params=[first_name])

本文分享自微信公众号 - 从零开始学自动化测试(yoyoketang),作者:上海悠悠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Selenium2+python自动化59-数据驱动(ddt)

    前言 在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程但是一样的。如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例...

    上海-悠悠
  • python笔记2-冒泡排序

    前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序。 一、基本原理 1.概念: 冒...

    上海-悠悠
  • python测试开发django-19.admin后台自定义显示

    django的admin后台默认显示的内容很少,只显示了表的相关信息,查看字段内容需点开详情才能查看,不是很直观。 在admin.py文件里面是可以自定义相关的...

    上海-悠悠
  • 浅谈JavaScript词法分析步骤

    JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:

    用户1432189
  • python_day1

    Unicode :2字节 -->UTF-8  (表示英文 用一个字节;表示中文 用3个字节)

    py3study
  • python之day1

      初学python会有学python2还是python3的困惑,因为现在公司的实际环境下大部分还是用2.7编写的代码,python3.X又向下不兼容2.X,我...

    py3study
  • Scala 学习笔记之类

    在Scala中,类并不声明为public. Scala源文件可以包含多个类,所有这些类都具有公有可见性.属性不声明默认为public.

    smartsi
  • js的高级知识---词法分析

    词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 具体步骤如下: 函数在运...

    coders
  • python_函数递归

    py3study
  • google gflag使用方法举例

    前言:   1. gflag是一种命令行编码参数解析工具,开源地址: https://github.com/gflags/gflags , 在caffe框架也使...

    Gxjun

扫码关注云+社区

领取腾讯云代金券