ORM查询之基于对象的正向查询与反向查询

对象形式的查询

# 正向查询

    ret1=models.Book.objects.first()
print(ret1.title)
print(ret1.price)
print(ret1.publisher)
print(ret1.publisher.name) # ret1.publisher是book属性,是Publish对象,非queryset集合

# 反向查找

ret2=models.Publish.objects.last()
print(ret2.name)
print(ret2.city)

#如何拿到与它绑定的Book对象呢?

    print(ret2.book_set.all())  # ret2.book_set是一个queryset集合,all()可以省略
print(ret2.book_set.all().values('title').distinct()) # 去重

ORM查询之基于条件的正向查询与反向查询

单表条件查询[双下划线实现表关联]:使用逗号分隔可以实现and的条件查询

#    models.Book.objects.filter(id__lt=10, id__gt=1)      # 获取id大于1 且 小于10的值
# models.Book.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
# models.Book.objects.exclude(id__notin=[11, 22, 33]) # not in
# models.Book.objects.filter(title__contains="Python") # 模糊匹配
# models.Book.objects.filter(name__icontains="ven") # icontains大小写不敏感
# models.Book.objects.filter(id__range=[1,12]) # 范围bettwen and
# startswith,istartswith, endswith, iendswith, # 以XXX开始/XXX结束

多表条件关联查询[双下划线实现表关联]

一对多[正向查询]: 使用逗号分隔可以实现and的条件查询,filter和values里面均可使用双下划线

#  models.Book.objects.filter(title='Python',id=5).values('publish__name').distinct()
# [{'publisher__city': '北京'}] publish__name这里的Book里面的publish属性
# models.Book.objects.filter(publish__id=5).values('title').distinct()
# Book查找出版社ID=5的书的名字
# models.Book.objects.filter(publish__id=5).values('publish_name').distinct()
# Book查找出版社ID=5的出版社的名字

一对多[反向查询]:使用逗号分隔可以实现and的条件查询,filter和values里面均可使用双下划线

#  models.Publish.objects.filter(book__title='Python',book_id=5).values('name') .distinct()
# [{'name': 'H出版社'}] 查找跟Publish相关的Book的内容,book__title中的book就是Publish的关联表名

多对多[正向查询]:使用逗号分隔可以实现and的条件查询

#  models.Book.objects.filter(title='Python').values('author__name ') .distinct()
# models.Book.objects.filter(author__name='FTL').values('title') .distinct()

多对多[反向查询]:使用逗号分隔可以实现and的条件查询

 #  models.Author.objects.filter(book__title='Python').values('name') .distinct() 

注意:

1、正向查找的book__title中的book是表名Book

2、正向查找的publish__city或者author__name中的publish,author是book表中绑定的字段【Book里面的属性】

3、一对多和多对多在这里用法没区别

ORM之聚合查询与分组查询

ORM之聚合查询与分组查询

聚合查询: aggregate(*args,**kwargs):可通过filter/Values过滤后聚合

通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值[键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的],即在查询集上生成聚合。

from django.db.models import Avg,Min,Sum,Max
>>> Book.objects.all().aggregate(Avg('price'))
{'price__avg': 34.35} # 系统定义名称
>>> Book.objects.all().aggregate (average_price=Avg('price'))
{'average_price': 34.35} # 自定义了名称
>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price')) # 其他查询

分组查询:annotate(*args,**kwargs):可通过filter/Values过滤后分组

可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。

from django.db.models import Avg,Min,Sum,Max
>>> Book.objects.values('author_name').annotate(Sum('price')) # 根据作者名分组后计算每个作者price

ORM之 F查询与Q查询

F查询: 只能适用于IntegerFiled  【使用了F查询,默认值是0】

from django.db.models import F
models.Book.objects.update(num=F('num') + 100)

Q查询:

from django.db.models import Q
#1 Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询
q1=models.Book.objects.filter(Q(title__startswith='P')).all()
# 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
q2=models.Book.objects.filter(Q(name='HHH')|Q(name='FTL')).all()
# 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
Q(title__startswith='P') | ~Q(pub_date__year=2005)
# 4、应用:
Book.objects.get(
Q(title__startswith='P') and
(Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
)
# 5、Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
# 正确:
Book.objects.get(
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
title__startswith='P')
# 错误:
Book.objects.get(
question__startswith='P',
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))

Q的信息补充

# 方式一: 直接用,不能动态实现
models.UserInfo.objects.filter(Q(Q(username=u)&Q(pwd=p))|Q(Q(emial=u)&Q(pwd=p)))
# 方式二: 创建Q对象且指定连接connector 【适用于多个元素,因为可用for循环,可动态循环】
con = Q() q1 = Q()
q1.connector = 'AND' q1.children.append(('email', e))
q1.children.append(('password', p))
# Q(Q(email=e)&Q(pwd=p)) q2 = Q()
q2.connector = 'AND'
q2.children.append(('username', _value_dict['user']))
q2.children.append(('password', _value_dict['pwd']))
# Q(Q(username=u)&Q(pwd=p)) con.add(q1, 'OR')
con.add(q2, 'OR') models.UserInfo.objects.filter(con)

  另外:

如果传递过来一个字典:那就可以进行组合搜索:
q1 = Q()
q2.connector = 'AND'
dict = {'id':1, 'username':'hhh', 'sex':'male', 'age':18}
for k,v in dict:
q1.children.append((k, v)) # 此时字典里面的所有值进行and组合查询

  

Python学习---ORM查询之基于对象的正向/反向/聚合/分组/Q/F查询的更多相关文章

  1. ORM查询之基于对象的正向查询与反向查询

    一.为什么有正向查询和反向查询? 举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应. 那么在实际 ...

  2. Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作

    Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...

  3. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  4. 巨蟒python全栈开发django8:基于对象和基于双下划线的多表查询

    1.编辑删除&&多对多关系的其他方法 提交,数据,得到结果 查看运行 给编辑和删除,添加样式 我们点击删除,可以成功删除 打印sql语句的,在settings.py里边的配置 LOGG ...

  5. python学习之路-day6-面向对象

    一.面向对象学习 特性 class类 一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性.共同的方法. 面向过程编程和面向对象编程: 面向过程编程:使用一系列的指 ...

  6. Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询

    一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增  create publish_id 传数字   (publish_id是数据库显示的字段名 ...

  7. 【Python学习之七】类和对象

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.面向对象编程1.概念(1)面向对象编程(OOP ...

  8. 【iOS基础学习随笔-1】-基于对象的程序设计

    一.对象: 1.在基于对象的程序设计中,一个程序分解成若干个不同的对象,每个对象都有自己独有的能力. 2.一个生产线上的一个工位只负责做好一件事.如果生产出的汽车的车门没有漆好,那问题很可能出在负责上 ...

  9. Python学习笔记之—— File(文件) 对象常用函数

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 1.file.close() close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触 ...

随机推荐

  1. 解决windows10下总是很快自动黑屏进入睡眠问题

    在用win10的过程中总是过几分钟不操作电脑,就自动黑屏睡眠了. 下面讲解一下如何解决这个问题: 第一步:win +r  输入regedit.exe 运行注册表管理器 第二步:定位到 HKEY_LOC ...

  2. ubuntu init启动流程

    ubuntu的init方式有两种:一种是System V initialization,一种是Upstart.ubuntu6.10以前的版本是第一种方式,之后的版本是第二种方式. 在旧式的System ...

  3. JAR,WAR,EAR的使用与区别

    WAR(Web Archive file)网络应用程序文件   是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件.为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文 ...

  4. jQuery插件开发之boxScroll与marquee

    BoxScroll 常见图片轮播效果的简单实现.可以数字列表控制或者左右按键控制.逻辑很简单,下面的Marquee形成环,这个到了尽头得往回跑,看看注释就知道了. 图片轮播GitHub:https:/ ...

  5. unity简易ui框架

    在unity项目开发中,ui模块的开发往往占据了很大一部分工作,部分游戏甚至绝大部分的工作都是在ui上,如何高效管理各种界面,这里分享一套高效易用的UI框架. 首先,我们定义一个PanelBase类, ...

  6. C# OO(初级思想)。

    继承,多态,封装 在C#中,为了能够合理描述自然界的规律,面向对象的编程引入了继承的概念,是面向对象编程中最重要的概念之一,定义了如何根据现有的类创建新类的过程. 继承:一个类派生出来的子类具有这个类 ...

  7. Hadoop源码学习笔记(6)——从ls命令一路解剖

    Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...

  8. 多线程-定时器Timer

    2019-04-1218:03:32 package 多线程.定时器Timer_重要; import java.util.Timer; import java.util.TimerTask; publ ...

  9. 十二、异步工具Timer

    一.简介 JDK提供一种异步线程工具Timer类,你可以利用这个类做延迟任务.周期性任务等. JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/ ...

  10. 1、类、封装(私有private、this关键字)

    类与对象 对象在需求中的使用 ​ 对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象. ​ 我们把大象装冰箱为例进行分析. ​ 在针对具体的需求,可以使用名词 ...