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 ...
随机推荐
- 相机用的 SD Card 锁Lock 烂掉了,无法正常写入
没错,又碰到奇奇怪怪的SD Card Lock 烂掉了 , 无法正常写入,不要急,千万不要扔了,拿起透明胶粘在 Lock 处,注意不要粘住金手指哦,再放回去就可以读写了,但是透明胶不耐摩擦,用了几次 ...
- admin源码分析
django settings 源码分析 导入settingso模块,进入源码,会发现settings是一个 单例 LazySettings类实例化产生的一个对象,LazySettings实例化后就会 ...
- UPDATE SELECT OUTPUT
-- 定义临时表变量,用于 output into 使用 DECLARE @VarOrderStatus table ( OrderNo nvarchar(50) NULL) -- update 表U ...
- CG-CTF 南邮 综合题2
个人网站 http://www.wjlshare.tk 0x00前言 主要考了三块 第一块是文件包含获取源码 第二块是通过sql绕过注入获取密码 第三块是三参数回调后门的利用 做这题的时候结合了别人的 ...
- eNSP——ARP及ProxyARP
原理: ARP (Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议.ARP表项可以分为动态和静态两种类型.动态ARP是利用ARP广播报文,动态执行并自动进 ...
- Spring boot 新建项目pom.xml文件报错 Failure to transfer org.springframework.boot:spring-boot-maven-plugin
新建项目依赖下载时网络中断导致资源损坏 删除.m2\repository中后缀名为lastUpdated的文件 cd %userprofile%\.m2\repository for /r %i in ...
- 使用Dreamweaver制作简单网站(二)
继续上周没完成的 一.新建iframe.css 1.点击文件-选择新建-css 2.ctrl+s保存为iframe.css 在style文件夹下. 3.回到main.html 右键选择-附加样式表,选 ...
- poj1753 (高斯消元法求异或方程组)
题目链接:http://poj.org/problem?id=1753 题意:经典开关问题,和poj1222一样,进行两次高斯消元即可,只用初始化的时候改一下初始状态.可能存在无解或多解的情况,多解要 ...
- 原生js实现图片的3d效果
<!doctype html><html lang="en"><head><meta charset="UTF-8"& ...
- (四)循环队列 VS 数组队列 (效率对比)
目录 背景 测试代码 结果 链表 随机访问 背景 各自完成插入 10万.20万 条随机数,然后再将这些随机数出队列 : 测试代码 /** * 测试速度 */ public String testSpe ...