开发者社区> 蓝色の流星VIP> 正文

比较运算符 F对象与Q对象

简介: Django运算表达式与Q对象/F对象 1 模型查询 概述: 1 查询集:表示从数据库中获取的对象的集合 2 查询集可以有多个过滤器,通过 逻辑运算符连接 3 过滤器就是一个函数,基于所给的参数限制查询的结果,类...
+关注继续查看

Django运算表达式与Q对象/F对象

1 模型查询

概述:
1 查询集:表示从数据库中获取的对象的集合
2 查询集可以有多个过滤器,通过 逻辑运算符连接
3 过滤器就是一个函数,基于所给的参数限制查询的结果,类似MySQL模糊查询中where语句
4 查询集等同select语句

2 查询集

特点:
1 查询集通过调用过滤器方进行查询, 查询集经过过滤器筛选后返回新的查询集,可以链式调用
2 惰性执行  创建查询集不会带来任何数据库的访问直到调用数据库才会访问

返回单个数据查询:
get()     返回一个满足条件的对象
         注意:没有找到符合条件的对象,模型类引发异常  模型类.DoesNotExists异常
         如果找到多个对象也会引发异常   模型类.MultipleObjectsReturned
count()   返回查询集中的对象个数
first()   返回第一个查询集对象
last()    返回最后一个查询集对象
exists()  查询集是否有数据,如果有数据返回true

限制查询集:查询集返回的是列表,可以采用下标的方法进行限制,等同于sql中的limit语句
studentList = Student.objects.all()[0:5]

查询集缓存 : 每个查询集都包含一个缓存,来最小化的对数据库访问。在新建的查询集中,缓存首
次为空,第一次对查询集求值,django会将数据缓存,并返回结果,以后结果直接使用缓存集的数据

3 常见过滤器

all()       返回所有对象
filter()     filter(键=值,键=值)  且关系
            返回符合条件的数据
            filter(键=值),filter(键=值)
exclude()   过滤掉符合条件数据
order_by()  排序
values()    一条数据就是是一个对象(字典),返回一个列表

4 比较运算符

(1)概述: 实现where语句,作为filter()  exclude()  get()的参数
   语法: 属性名称__运算符 = 值
   外键: 属性名_id
   转义: 类似like语句,是为了匹配占位,匹配数据中的%,sql中where like '\%'
         filter(sname__contains = '%')

(2)常见的比较运算符:
    exact        判断,大小写敏感
                 filter(isDelete=False)
    contains     是否包含,大小写敏感
                stuList = Student.objects.filter(sname__contains ='孙' )
    startswith   以value开头,大小写敏感
                stuList = Student.objects.filter(sname__startswith ='孙' )
    endwith      以value结尾,大小写敏感 
    in   是否包含在范围内    filter(pk__in=[2,4,6,8,10])
 注: 以上四个前面加上i,就表示不区分大小写,iexact,icontains,istartswith,iendswith

(3) 其他形式查询
为空判断:
    isnull ,isnotnull   是否为空   filter(sname__isnull=Flase)  
比较运算:
    gt   大于
    gte  大于等于
    lt   小于
    lte  小于等于
    filter(sage_gt=30)年龄大于30
时间查询:
    year/month/day/week_day/hour/minute/second   filter(lastTime__year=2017)
    跨关查询   处理join查询   模型类型__属性名__运算符(可选)
    查询快捷   pk   代表的主键   

5 F对象与Q对象

常见的聚合函数:
使用aggregate()函数返回聚合函数的值
Avg  Count   Max   Min   sum

from dango.db.models import Max
maxAge = Student.objects.aggregate(Max('sage'))   找出学生年龄最大的

F对象
1 可以使用模型的A属性与B属性进行比较
    from django.db.models  import F,Q
    def grades(request):
    g = Grades.objects.filter(ggirlnum_gt=F('gboynum'))   找到女生人输大于男生人数的班级
2 支持F对象的算术运算  filter(ggirlnum_gt=F('gboynum')+20)
3 F对象的参数可以是跨表字段
    models.Book.objects.filter(bread_num=F(''author_name'))
4 F对象参数如果是date/time,可以进行日期的加减运算:
    models.Book.objects.filter(bpub_date__lt=F('bpub_date') + timedelta(days=5))

Q对象
概述    过滤器的方法中的关键字参数,,条件为And模式,采用逻辑或引入Q对象
需求    进行or查询,或查询
解决    使用Q对象

Q对象可以使用&(and)、|(or)操作符组合起来
studentList = Student.objects.filter(Q(pk__lt = 3)|Q(sage__gt=50))  pk_id小于3或年龄大于50岁
models.User.objects.filter(Q(username='老王') & Q(userpass='admin'))   条件与组合
models.User.objects.filter(~Q(username='老王'))   条件非表示取反
可以使用 &(and) |(or)  ~(not) 结合括号进行分组,构造更复杂的Q对象
filter函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and

下面分享一个综合用法:

 def get(self, request, *args, **kwargs):
        filters = request.GET
        #找出符合customer的数据转成列表
        Qs = [Q(customer=request.user.customer)]
        try:
            if 'limit' in filters:
                limit = abs(int(filters['limit']))
                if limit > 50:
                    limit = 50
            else:
                limit = 15
            start_id = int(filters.get('start_id', 0))
            #添加符合start_id的对象
            Qs.append(Q(id__gt=start_id))
            #添加符合状态的state
            if 'state' in filters:
                Qs.append(Q(state__in=filters['state']))
            else:
                Qs.append(Q(state__in=[0, 1, 2, 3, 4]))
            #添加符合title的数据
            if 'title' in filters:
                Qs.append(Q(title__contains=filters['title']))
        except Exception:
            return params_error({"filters": "过滤参数不合法"})

        #通过*Qs,对列表数据同时满足上述情况的数据进行总的帅选,并设置限制集
        sets = Questionnaire.objects.filter(*Qs)[:limit]

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
转义符与运算符
转义符:\\ 代码中输出一个斜杠    \"输出一个双引号      \'输出一个单引号 告诉Java这是内容不会语法 \n换行    回车 换行     public class T1 { public static void main(String[] args) { System.
1322 0
Sql Server的艺术(五) SQL UNION与UNION JOIN运算符
原文:Sql Server的艺术(五) SQL UNION与UNION JOIN运算符 1、关系的集合运算   集合的3个最普通的运算是并、交和差。对于任意集合R和S(当然,这里的R和S可以是表R和表S),这些运算定义如下。
983 0
Flink-CEP之模式流与运算符
之前我们分析了CEP的API,接下来我们将分析CEP API的内部实现包括模式流与运算符。 模式流 模式流(PatternStream)是CEP模式匹配的流抽象,一个PatternStream对象表示模式检测到的序列所对应的流。
1460 0
【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )(一)
【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )(一)
30 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23628 0
python-运算符与表达式
运算符与表达式 你所编写的大多数语句(逻辑行)都包含了表达式(Expressions)。一个表达式的简单例子便是 2+3。表达式可以拆分成运算符(Operators)与操作数(Operands)。
847 0
【C/C++学院】(4)c++开篇/类和对象/命名空间/类型增强/三目运算符/const专题/引用专题/函数增强
<h1>1.类和对象</h1> <p>成员函数,成员变量,抽象封装的能力。</p> <p>求圆的面积;</p> <p></p> <pre code_snippet_id="584766" snippet_file_name="blog_20150120_1_4534440" name="code" class="objc">#include &lt;iostream&gt; usi
1311 0
66
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载