Django单表查询及其方法
单表查询
前期准备
首先新建一个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单表查询及其方法的更多相关文章
- Django 单表查询
前言 如何只单独测试django中的某一个py文件呢?或者说如何书写测试脚本? 我们可以在任意一个py文件(应用下的tests或者自己新建一个)中书写以下代码: 前期准备 创建一个电影表 class ...
- 65、django之模型层(model)--添加、单表查询、修改基础
上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...
- django之数据库表的单表查询
一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...
- django之模型层(model)--添加、单表查询、修改基础
上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...
- Django ORM 操作 必知必会13条 单表查询
ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...
- Django框架----数据库表的单表查询
一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...
- Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段
单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...
- 数据库开发-Django ORM的单表查询
数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
随机推荐
- Reveal v4(8796) 使用
文件下载地址 http://xclient.info/s/reveal.html dmg安装成功后, pod install 植入项目. pod 'Reveal-SDK', '~> 4', ...
- Jquery Easyui与Jquery Bootstrap的比较
1.easyui是js框架 :bootstrap 是css框架 ,bootstrap = 样式库 + 一堆jQuery插件,顺便解释一句,如果你只需要bootstrap的样式,你完全不用引入jQuer ...
- 19 个让 MySQL 效率提高 3 倍的 SQL 优化技巧
优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 本文我们就来谈谈 MySQL 中常用的 SQL 优化 ...
- Mac下Unity使用Jenkins自动化打包
重要的事情说三遍:不要使用jenkins dmg安装包直接安装,用brew安装 PS:会有权限问题 重要的事情说三遍:不要使用jenkins dmg安装包直接安装,用brew安装 重要的事情说三遍: ...
- IDEA配置Hystrix过程中报错: java.lang.IllegalStateException: No instances available for user-service
最近在练习微服务架构中, 使用IDEA配置完Hystrix, 添加熔断方法后, 在浏览器中访问未启动的( 含有熔断方法注解 )的路径时, 报出了 : 500: No instances availab ...
- 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)
一.粘包/拆包概念 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认 ...
- 【VS开发】VC下加载JPG/GIF/PNG图片的两种方法
1.用API OleLoadPicture来加载JPG.GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明) OleLoadPicture 函数实际上创建了一个IPictu ...
- sql语句 两表关联查询计算数量
select sum(a1.`num`) from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`ord ...
- #【Python】【基础知识】【模块】【Python的常用模块】
在IDE解释器中,执行help('modules')可查看当前环境可调用的Python模块: >>> help('modules') Please wait a moment whi ...
- SQL SERVER创建表
创建表 create table table_name ( column_name_1 data_type, column_name_2 data_type NOT NULL, column_name ...