单表查询

前期准备

首先新建一个test的python文件,然后再manage.py中导入main语句及其下面的复制到新文件中

并导入django 写上django.setup() 就可以导入对应的models进行数据操作了

import os

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "book_manage.settings")
import django django.setup()
from book_cms import models res = models.Author.objects.all()
print(res)

setting中的配置输出原生SQL语句的代码

如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看

在Django项目的settings.py文件中,在最后复制粘贴如下代码:

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

MODEL中的表字段

class Book(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_length=8, decimal_places=2, max_digits=8)
publish = models.ForeignKey(to='Publish')
authors = models.ManyToManyField(to='Author') def __str__(self):
return "书名:%s|价格%s|出版社:%s"%(self.name,self.price,self.publish) #DateField里面的参数
# auto_now_add:创建数据记录的时候会把当前时间添加到数据库。
# auto_now:每次更新数据记录的时候会更新该字段。

完整的表结构和表数据

id	图书名	作者名	价格	出版社
1 西游记 吴承恩 55.5 商务印书馆
2 牡丹亭 汤显祖 78 上海古籍出版社
3 利用Python进行数据分析 麦金尼 89.2 机械工业出版社
4 非理性繁荣 罗伯特席勒 46.9 中国人民大学出版社
5 高等数学 同济大学出版社 40 高等教育出版社

单表操作回顾

新增数据

	# 第一种:有返回值,并且就是当前被创建的数据对象
modles.Book.objects.create(name='',price='',publish='',author='',create_time='2019-5-1')
# 第二种:先实例化产生对象,然后调用save方法保存
book_obj = models.Book(name='',price='',publish='',author='',create_time='2019-5-1')
book_obj.save()
# 2.验证时间格式字段即可以传字符串也可以传时间对象
import datetime
ctime = datetime.datetime.now()
book = models.Book.objects.create(name='',price='',author='',create_time=ctime)

删除数据

		"""删除数据"""
# 1.删除书名为xxx的这本书 queryset方法
res = models.Book.objects.filter(name='').delete()
print(res)
# 2.删除书名为xxx的这本书 queryset方法
res = models.Book.objects.filter(name='').first()
res.delete()

修改数据

    # 1.queryset修改
models.Book.objects.filter(name='').update(price='')
# 2.对象修改
book = models.Book.objects.filter(name='').first()
book.price = 66.66
book.save() # 对象只有保存方法 这样也能实现修改需求

单表查询的13个方法

强调:只要是QuerySet对象就可以无限制的点QuerySet的方法

QuerySet对象可以作为判断的条件,为空的时候对应的布尔值也是False

all()

all方法将查询的全部数据查询出来

 res = models.Book.objects.all()
print(res) <QuerySet [
<Book: 书名:西游记|价格55.50|出版社:商务印书馆>,
<Book: 书名:牡丹亭|价格78.00|出版社:上海古籍出版社>,
<Book: 书名:利用Python进行数据分析|价格89.20|出版社:机械工业出版社>,
<Book: 书名:非理性繁荣|价格46.90|出版社:中国人民大学出版社>,
<Book: 书名:高等数学|价格40.00|出版社:高等教育出版社>]>

filter()

想当与MySQL中的where后面跟筛选条件

 res = models.Book.objects.filter(name='西游记')
print(res)
<QuerySet [<Book: 书名:西游记|价格55.50|出版社:商务印书馆>]>

为了方便演示我在数据库中添加一条数据

6	西游记	吴承恩	37	上海古籍出版社

如果有多条会返回多条的数据

res = models.Book.objects.filter(name='西游记')
print(res) <QuerySet
[<Book: 书名:西游记|价格55.50|出版社:商务印书馆>,
<Book: 书名:西游记|价格37.00|出版社:上海古籍出版社>]>

可以在filter里面跟上多个条件,关系是and的关系


res = models.Book.objects.filter(name='西游记', price=37.00)
print(res)
<QuerySet [<Book: 书名:西游记|价格37.00|出版社:上海古籍出版社>]>

可以利用query打印出SQL语句

SELECT
`book_cms_book`.`id`,
`book_cms_book`.`name`,
`book_cms_book`.`price`,
`book_cms_book`.`publish_id`
FROM
`book_cms_book`
WHERE
( `book_cms_book`.`name` = 西游记 AND `book_cms_book`.`price` = 37 )

get方法

get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。(源码就去搂一眼~诠释为何只能是一个对象),通常用在查询的值为主键的时候

两个值报错

  res = models.Book.objects.get(name='西游记')
print(res)
book_cms.models.MultipleObjectsReturned: get() returned more than one Book -- it returned 2!

不存在值的时候报错

    res = models.Book.objects.get(name='西游记001')
print(res)
book_cms.models.DoesNotExist: Book matching query does not exist.

一个值得时候返回对象

res = models.Book.objects.get(name='高等数学')
print(res, type(res))
书名:高等数学|价格40.00|出版社:高等教育出版社 <class 'book_cms.models.Book'>

execute()

它包含了与所给筛选条件不匹配的对象

    res = models.Book.objects.exclude(name='西游记')
print(res, type(res)) <QuerySet [<Book: 书名:牡丹亭|价格78.00|出版社:上海古籍出版社>, <Book: 书名:利用Python进行数据分析|价格89.20|出版社:机械工业出版社>, <Book: 书名:非理性繁荣|价格46.90|出版社:中国人民大学出版社>, <Book: 书名:高等数学|价格40.00|出版社:高等教育出版社>]> <class 'django.db.models.query.QuerySet'>

同样也支持多个参数,关系为and关系

order_by()

返回QuerySet对象

对查询结果排序('-id')/('price')

可以传入多个排序字段

默认正序,如果用反查在字段前加-

res = models.Book.objects.filter(name = '西游记').order_by('-price')
print(res, type(res))
<QuerySet [
<Book: 书名:西游记|价格55.50|出版社:商务印书馆>,
<Book: 书名:西游记|价格37.00|出版社:上海古籍出版社>]>

reverser()

对结果进行反向排序,前提是必须要有排序字段

count()

返回数据库中匹配查询(QuerySet)的对象数量。返回数字

first()

返回第一条记录,为表记录里面的对象

last()

返回最后一条记录,为表记录里面的对象

exists

对查询出来的Query Set进行有误数据的判断,有就返回True,否则返回False

values(*field)

返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列

distinct():

从返回结果中剔除重复纪录,去重的前提必须是返回的数据要所有的都重复才能去重

查询方法的返回值类型总结

返回QuerySet对象的方法有

all() ,filter() ,exclude() ,order_by() ,reverse() ,distinct()

特殊的QuerySet

values() 返回一个可迭代的字典序列

values_list() 返回一个可迭代的元祖序列

返回具体对象的

get() ,first() ,last()

返回布尔值的方法有:

exists()

返回数字的方法有

count()

基于双下划线的查询

使用方式

res = models.Book.objects.filter(price__gt=60)
print(res, type(res))
<QuerySet [<Book: 书名:牡丹亭|价格78.00|出版社:上海古籍出版社>,
<Book: 书名:利用Python进行数据分析|价格89.20|出版社:机械工业出版社>]>
<class 'django.db.models.query.QuerySet'>

其他类似方法

Book.objects.filter(price__in=[100,200,300]) //in
Book.objects.filter(price__gt=100) //greater than 大于
Book.objects.filter(price__lt=100) //less than 小于
Book.objects.filter(price__gte=100) // greater than equal 大于等于
Book.objects.filter(price__lte=100) //less than equal 小于等于
Book.objects.filter(price__range=[100,200]) //between 100 and 200
Book.objects.filter(title__contains="python") // like %python%
Book.objects.filter(title__icontains="python") //忽略大小写查询
Book.objects.filter(title__startswith="py") //py%
Book.objects.filter(pub_date__year=2012) // 针对日期查询year为2012 可以查询月份和天数

Django单表查询及其方法的更多相关文章

  1. Django 单表查询

    前言 如何只单独测试django中的某一个py文件呢?或者说如何书写测试脚本? 我们可以在任意一个py文件(应用下的tests或者自己新建一个)中书写以下代码: 前期准备 创建一个电影表 class ...

  2. 65、django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  3. django之数据库表的单表查询

    一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...

  4. django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  5. Django ORM 操作 必知必会13条 单表查询

    ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...

  6. Django框架----数据库表的单表查询

    一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...

  7. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  8. 数据库开发-Django ORM的单表查询

    数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...

  9. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

随机推荐

  1. Reveal v4(8796) 使用

    文件下载地址   http://xclient.info/s/reveal.html dmg安装成功后, pod install  植入项目. pod 'Reveal-SDK', '~> 4', ...

  2. Jquery Easyui与Jquery Bootstrap的比较

    1.easyui是js框架 :bootstrap 是css框架 ,bootstrap = 样式库 + 一堆jQuery插件,顺便解释一句,如果你只需要bootstrap的样式,你完全不用引入jQuer ...

  3. 19 个让 MySQL 效率提高 3 倍的 SQL 优化技巧

    优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 本文我们就来谈谈 MySQL 中常用的 SQL 优化 ...

  4. Mac下Unity使用Jenkins自动化打包

    重要的事情说三遍:不要使用jenkins dmg安装包直接安装,用brew安装  PS:会有权限问题 重要的事情说三遍:不要使用jenkins dmg安装包直接安装,用brew安装 重要的事情说三遍: ...

  5. IDEA配置Hystrix过程中报错: java.lang.IllegalStateException: No instances available for user-service

    最近在练习微服务架构中, 使用IDEA配置完Hystrix, 添加熔断方法后, 在浏览器中访问未启动的( 含有熔断方法注解 )的路径时, 报出了 : 500: No instances availab ...

  6. 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)

    一.粘包/拆包概念 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认 ...

  7. 【VS开发】VC下加载JPG/GIF/PNG图片的两种方法

    1.用API OleLoadPicture来加载JPG.GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明) OleLoadPicture 函数实际上创建了一个IPictu ...

  8. sql语句 两表关联查询计算数量

    select sum(a1.`num`)   from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`ord ...

  9. #【Python】【基础知识】【模块】【Python的常用模块】

    在IDE解释器中,执行help('modules')可查看当前环境可调用的Python模块: >>> help('modules') Please wait a moment whi ...

  10. SQL SERVER创建表

    创建表 create table table_name ( column_name_1 data_type, column_name_2 data_type NOT NULL, column_name ...