django 数据库查询 ORM
实用的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的更多相关文章
- Django 数据库查询集合(多对多)
Django 数据库查询集合(双下划线连表操作) 目录: 1.Django环境搭建 2.数据库建表 3.写入数据 4.查询语句 Django环境搭建 1.安装django pip install dj ...
- Django 数据库查询集合(双下划线连表操作)
Django是一款优秀的web框架,有着自己的ORM数据库模型.在项目中一直使用django数据库,写一篇文章专门记录一下数据库操作.略写django工程创建过程,详写查询过程.可以和sqlalche ...
- Django 数据库与ORM
一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使用sqlite的数据库,默认自带 ...
- Django 数据库查询
#!/usr/bin/python #coding:utf-8 from django.shortcuts import render; from django.shortcuts import re ...
- Django聚合查询 orm字段及属性
目录 一 聚合查询 1. 级联 级联删除 级联更新 2. 聚合函数 使用 aggregate 使用场景 3. 分组查询 语法 使用 annotate 代码 4. F与Q查询 F查询 Q查询 二 ORM ...
- django 数据库查询的几个知识点
django查询db过程中遇到的几个问题: 1. 数据库切换,用using products = models.TProductCredit.objects.using(') 2.查询结构集是Quer ...
- Django数据库创建与查询及ORM的概念
ORM:是封装在pymysql上层的文件.他的作用是把python语句转换成sql语句,从而去数据库里操作数据.从数据库里获得的数据,经过orm转换为对象,对象可以直接调用属性获得值.orm本质是个中 ...
- Django框架 之 数据库与ORM
浏览目录 数据库的配置 ORM表模型 ORM之增(create,save) ORM之删(delete) ORM之改(update和save) ORM之查(filter,value) 一.数据库的配置 ...
- Django框架 之 ORM查询操作详解
Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...
随机推荐
- 1159 Palindrome
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 68562 Accepted: 23869 Desc ...
- python 环境下 安装 gdal
起因:需要做一个城市扩张的东西,然后再GitHub上下载了一段代码,不过作者没怎么说清楚要怎么用,早上琢磨半天,归结到我需要先下载python的gdal模块. 关于:搜索下来,发现gdal(Geosp ...
- java.io.IOException: Could not delete path 'D:\mycode\reactnative\SecondTest\android\app\build\generated\source\r \release\android\support\v7
问题解决 直观上看是没有删除某个文件,产生的IOException异常,实际上是因为上次编译导致的缓存没有清空导致的. 进入到android目录下运行下面代码清除上次打包时的缓存: ./gradlew ...
- Python学习笔记第二十六周(Django补充)
一.基于jQuery的ajax实现(最底层方法:$.jax()) $.ajax( url: type:''POST“ ) $.get(url,[data],[callback],[type]) #c ...
- 《ProgrammingHive》阅读笔记-第二章
书本第二章的一些知识点,在cloudera-quickstart-vm-5.8.0-0上进行操作. 配置文件 配置在/etc/hive/conf/hive-site.xml文件里面,采用mysql作为 ...
- 【软件安装】nvidia驱动安装事宜
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html https://docs.nvidia.com/cuda/arch ...
- linux基础命令一
linux基础命令一 1.date命令 date命令介绍:显示或者设置系统日期 date命令的语法: 显示日期:date [options...] [+FORMAT] FORMAT:为显示日期的格 ...
- jq 绑定事件和解绑事件
<!DOCTYPE html><html><head> <script src="http://cdn.static.runoob.com/libs ...
- 19/03/13python学习笔记
1.变量命名 name1 = 1 name2 = "sunj" 2.命名变量的规则 (1.变量是字母.数字.下划线的组合(2.不能以数字开头(3.不能用关键词命名变量(4.变量中间 ...
- mongodb与mysql命令详细对比
传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象(docu ...