实用的logging模块:

zaisetting配置中加入下列配置,将sql语句打印到屏幕上,可以进行查看。

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}  

单表操作:

  添加记录:

 # 方式1:
#obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100) 注意:Book.objects.create()的返回值是当前添加的记录对象这种方式不需要save()
# 方式2:
book_obj=Book(title="python2",publishDate="2012-12-12",price=100)
book_obj.save()

  查询记录:(数据类型:QuerySet)   [...,...,]

<1> all():                 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<5> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <4> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
model的实例化对象,而是一个可迭代的字典序列
<9> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <6> order_by(*field): 对查询结果排序 <7> reverse(): 对查询结果反向排序 <8> distinct(): 从返回结果中剔除重复纪录 <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <11> first(): 返回第一条记录 <12> last(): 返回最后一条记录 <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False 双下划线的查询: book_list=Book.objects.filter(price__gt=60)
book_list=Book.objects.filter(price__lt=60)
book_list=Book.objects.filter(title__contains="py") #这个用于查看是否包含某个数据。
book_list=Book.objects.filter(title__startswith="python")
book_list=Book.objects.filter(price__in=[60,70,100])
book_list=Book.objects.filter(price__range=[50,99])

删除:

删除:
Book.objects.filter().delete() # 默认级联删除

更新:

Book.objects.filter().update(price=50,.....)

一对多创建:

publish=models.ForeignKey(to="Publish",to_field="id")

多对多创建:

authors=models.ManyToManyField(to="Author")
author=models.OneToOneField("Author")

一对一添加:

            # 方式1:
#Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish_id=2)
# 方式2:
publish_obj=Publish.objects.filter(name="人民出版社")[0]
Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish=publish_obj)

多对多添加:

book_authors.objects.create(book_id=1,author_id=2)   

            book_obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish_id=2)             

            book_obj.authors.all()

            book_obj.authors.add(obj1,obj2....)
book_obj.authors.add(*[]) # book_obj.authors.remove(obj1,obj2....)
book_obj.authors.remove(*[])
book_obj.authors.clear() 批量添加:
#在插入数据库记录的时候,需要将列表一条条插入数据库,容易造成性能浪费。插入一条记录生成一个sql语句。

    #下方这个解决这个问题。
models.UserInfo.objects.bulk_create() #里面是一个列表,这样是生成一个sql语句,将里面的用户全部插入

基于对象的跨表操作(子查询):

正查询与反查询:

  

一对多: 

        正向查询,按字段:publish
反向查询,按表名小写_set 查询: 查询java这本书的出版社的邮箱 book_obj=Book.objects.filter(title="java").first()
book_obj.publish.email
多对多:

        正向查询,按字段:authors
反向查询,按表名小写_set 查询:
book_obj.authors.all() # 与这本书籍关联的所有作者对象集合
author_obj.book_set.all()
 一对一:

        添加记录:参考一对多
查询记录: 正向查询,按字段:author
反向查询,按表名小写

基于QuerySet的跨表查询(join查询)

#一对多 publish:与当前书籍对象关联的的出版社对象
publish=models.ForeignKey(to="Publish",to_field="id")
#多对多 authors
authors=models.ManyToManyField(to="Author")
author=models.OneToOneField("Author") 正向查询,按字段:publish
反向查询,按表名小写
一对多:
例1:
查询java这本书的出版社的邮箱(正向查询) ret=Book.objects.filter(nid__gt=6).values("publish__name") sql:
SELECT "app01_publish"."name"
FROM "app01_book" INNER JOIN "app01_publish"
ON ("app01_book"."publish_id" = "app01_publish"."id")
WHERE "app01_book"."nid" > 6 LIMIT 21; values实现机制:
对调用的QuerySet集合对象里面的每一个对象循环遍历,取出每一个对象的显示字段的值,组成新的字典,放在一个新的QuerySet中,返回 例2:
# 查询人民出版社出版过的所有的书籍名称(反向查询)
ret=Publish.objects.filter(name="人民出版社").values("book__title")
print(ret)
<QuerySet [{'book__title': 'golang'}, {'book__title': 'linux2'}, {'book__title': 'qq'}, {'book__title': 'www'}]>
多对多的查询
# 查询php这本书籍的所有作者的名字以及年龄
# ret=Book.objects.filter(title="php").values("authors__name","authors__age")
# print(ret)
# 查询alex出版社过的所有书籍的名称和价格
# ret=Author.objects.filter(name="alex").values("book__title","book__price")
# print(ret)
一对一查询
# 查询tel=789的作者的名字
ret=AuthorDetail.objects.filter(tel="").values("author__name")
# 查询alex的手机号是多少
ret=Author.objects.filter(name="alex").values("authordetail__tel")
扩展:
#查询人民出版社出版过的所有的书籍名称(两种查询思路,基表不同) ret=Publish.objects.filter(name="人民出版社").values("book__title")
ret=Book.objects.filter(publish__name="人民出版社").values("title") # 手机号以151开头的作者出版过的所有书籍名称以及出版社名称 ret=Book.objects.filter(authors__authordetail__tel__startswith="").values("title","publish__name")
print(ret) SELECT "app01_book"."title", "app01_publish"."name" FROM "app01_book"
INNER JOIN "app01_book_authors" ON ("app01_book"."nid" = "app01_book_authors"."book_id")
INNER JOIN "app01_author" ON ("app01_book_authors"."author_id" = "app01_author"."id")
INNER JOIN "app01_authordetail" ON ("app01_author"."id" = "app01_authordetail"."author_id")
INNER JOIN "app01_publish" ON ("app01_book"."publish_id" = "app01_publish"."id")
WHERE
"app01_authordetail"."tel" LIKE '7%' ESCAPE '\' LIMIT 21; args=('7%',)

聚合查询与分组查询

ORM:

        # 聚合函数  aggregate
from django.db.models import Sum,Count,Max,Min,Avg
# ret=Book.objects.all().aggregate(Sum("price"))
# print(ret) # 分组函数 annotate # 查询每一个出版社出版社出版的书籍个数
# ret=Publish.objects.all().annotate(c=Count("book__title")).values("name","c")
# print(ret) # <QuerySet [<Publish: 人民出版社>, <Publish: 机械出版社>, <Publish: 北京出版社>]> # 查询每一本书的作者个数
#ret=Book.objects.all().annotate(author_num=Count("authors")).values("author_num","title")
# ret=Book.objects.all().annotate(author_num=Count("authors")).filter(author_num__gt=0)
# print(ret)

ORM中的extra函数:

我们可以用extra这个接口来实现较为复杂的sql函数,下面的archive_date是你自命名的字段,strftime相当于mysql中的date_format函数,将日期转换为想要的格式。

date_list=models.Article.objects.extra(select={"archive_date":"strftime('%%Y-%%m',create_time)"}).values('archive_date').annotate(count=Count("nid")).values_list("archive_date",'count')

xxx

django 数据库查询 ORM的更多相关文章

  1. Django 数据库查询集合(多对多)

    Django 数据库查询集合(双下划线连表操作) 目录: 1.Django环境搭建 2.数据库建表 3.写入数据 4.查询语句 Django环境搭建 1.安装django pip install dj ...

  2. Django 数据库查询集合(双下划线连表操作)

    Django是一款优秀的web框架,有着自己的ORM数据库模型.在项目中一直使用django数据库,写一篇文章专门记录一下数据库操作.略写django工程创建过程,详写查询过程.可以和sqlalche ...

  3. Django 数据库与ORM

    一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库.  <1> sqlite django默认使用sqlite的数据库,默认自带 ...

  4. Django 数据库查询

    #!/usr/bin/python #coding:utf-8 from django.shortcuts import render; from django.shortcuts import re ...

  5. Django聚合查询 orm字段及属性

    目录 一 聚合查询 1. 级联 级联删除 级联更新 2. 聚合函数 使用 aggregate 使用场景 3. 分组查询 语法 使用 annotate 代码 4. F与Q查询 F查询 Q查询 二 ORM ...

  6. django 数据库查询的几个知识点

    django查询db过程中遇到的几个问题: 1. 数据库切换,用using products = models.TProductCredit.objects.using(') 2.查询结构集是Quer ...

  7. Django数据库创建与查询及ORM的概念

    ORM:是封装在pymysql上层的文件.他的作用是把python语句转换成sql语句,从而去数据库里操作数据.从数据库里获得的数据,经过orm转换为对象,对象可以直接调用属性获得值.orm本质是个中 ...

  8. Django框架 之 数据库与ORM

    浏览目录 数据库的配置 ORM表模型 ORM之增(create,save) ORM之删(delete) ORM之改(update和save) ORM之查(filter,value) 一.数据库的配置 ...

  9. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

随机推荐

  1. OpenCV学习(一)基础篇

    OpenCV 2 计算机视觉编程手册读书笔记1 矩阵创建 Mat类是OpenCV中非常有用类,用来创建和操作多维矩阵.可以有很多方法构造它. // 构造函数 //! constructs 2D mat ...

  2. python自学第11天-单线程并发、迭代器,序列化,获取路径

    单线程并发 import time def consumer(name): print("%s 准备吃包子了"%name) while True: baozi=yield#变成一个 ...

  3. js 查找当前元素/this

    function findTabTitle(pageId) { var $ele = null; $(".page-tabs-content").find("a.menu ...

  4. CentOS上升级gcc编译器使支持C++11

    首先向博主致敬,好的东西拿来共享了,用一下不错. https://blog.csdn.net/clirus/article/details/62424517 0. 目标  最近在学习c++11,我本机 ...

  5. element-ui Select 清空model,页面没有清空选中项的问题

    业务场景: 在dialog 每次打开时, 选择应用程序要初始化为空. 最初的做法为: 监听dialog的show状态,当show为false时,设置selectApp为空这样写时,虽然selectAp ...

  6. 搭建数据驱动框架第一步-实现一个构造函数,将对Excel文件的基本操作API都封装进去

    Python处理Excel常用操作就是读和写,我的需求是需要在原excel文件中进行读写操作.共用到了两个模块xlrd和openpyxl,这两个模块都是需要自己去安装的.openpyxl只能用来处理 ...

  7. zabbix3.4安转

    其实很简单  在官网上有安装文档,我只不过是将官网上的拿了下来 安装apache和php 数据库mariadb(我的系统是centos7的所以安装mariadb) 开始zabbix的安装 本次实验 系 ...

  8. 【Java】字符串工具类

    import android.annotation.SuppressLint; import java.io.UnsupportedEncodingException; import java.uti ...

  9. MySQL Execution Plan--IN查询计划(2)

    在MySQL中,IN查找经常出现性能问题,相同SQL在MySQL不同版本中表现不同. 准备测试数据: ## 创建表tb001 CREATE TABLE tb001( id INT unsigned N ...

  10. Head First 设计模式 (Eric Freeman / Elisabeth Freeman / Kathy Sierra / Bert Bates 著)

    1. 欢迎来到设计模式世界:设计模式入门 (已看) 策略模式 定义了算法族,分别分装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 设计原则 找出应用中可能需要变化之处,把它们 ...