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 ...
随机推荐
- 【leetcode_easy】538. Convert BST to Greater Tree
problem 538. Convert BST to Greater Tree 参考 1. Leetcode_easy_538. Convert BST to Greater Tree; 完
- Redfish技术介绍
1.1 概述 Redfish是一种基于HTTPs服务的管理标准,利用RESTful接口实现设备管理.每个HTTPs操作都以UTF-8编码的JSON格式(JSON是一种key-value对的数据格式) ...
- 【VS开发】QueryPerformanceFrequency与QueryPerformanceCounter的使用
LARGE_INTEGER tima,timb; QueryPerformanceCounter(&tima); 在 Windows Server 2003 和 WindowsXP 中使用 Q ...
- NDK学习笔记-JNI的引用
JNI中的引用意在告知虚拟机何时回收一个JNI变量 JNI引用变量分为局部引用和全局引用 局部引用 局部引用,通过DeletLocalRef手动释放对象 原因 访问一个很大的Java对象,使用之后还用 ...
- MySql中的count、NULL和空串的区别
**1.count (1).count (*) 与 count (列名) 的区别** 表 count(1) count(*) count (列名) 作用 统计表中的所有的记录数 会统计表中的所有的记录 ...
- IIS 6.0的web园 最大工作进程数细谈
这篇文章主要介绍了IIS 6.0的web园 最大工作进程数,需要的朋友可以参考下:(摘自:http://www.jb51.net/article/84817.htm) IIS 6.0允许将应用程序池配 ...
- SQL SERVER2014 加密 备份恢复 学习 (一)
SQL 自2008(还是2005)之后,推出加密功能,可以一定程度上保护数据库的备份安全.以下测试环境为:sql server 2014主要目的:将备份的文件加密,在其它电脑上恢复时必须有证书和密钥才 ...
- Json乱码解决统一代码
我们在springmvc中使用json经常出现乱码格式 如下图: 我们可以在@RequestMapping()中配置,produces = "application/json;charse ...
- No package 'eventlog' found
syslog-ng のインスト�ル手� ●ダウンロ�ドサイト http://www.balabit.com/downloads/files/syslog-ng/sources/stable/src/ ...
- Vue框架下实现导入导出Excel、导出PDF
项目需求:开发一套基于Vue框架的工程档案管理系统,用于工程项目资料的填写.编辑和归档,经调研需支持如下功能: Excel报表的导入.导出 PDF文件的导出 打印表格 经过技术选型,项目组一致决定通过 ...