单表查询

前期准备

首先新建一个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. 相机用的 SD Card 锁Lock 烂掉了,无法正常写入

    没错,又碰到奇奇怪怪的SD Card  Lock 烂掉了 , 无法正常写入,不要急,千万不要扔了,拿起透明胶粘在 Lock 处,注意不要粘住金手指哦,再放回去就可以读写了,但是透明胶不耐摩擦,用了几次 ...

  2. admin源码分析

    django settings 源码分析 导入settingso模块,进入源码,会发现settings是一个 单例 LazySettings类实例化产生的一个对象,LazySettings实例化后就会 ...

  3. UPDATE SELECT OUTPUT

    -- 定义临时表变量,用于 output into 使用 DECLARE @VarOrderStatus table ( OrderNo nvarchar(50) NULL) -- update 表U ...

  4. CG-CTF 南邮 综合题2

    个人网站 http://www.wjlshare.tk 0x00前言 主要考了三块 第一块是文件包含获取源码 第二块是通过sql绕过注入获取密码 第三块是三参数回调后门的利用 做这题的时候结合了别人的 ...

  5. eNSP——ARP及ProxyARP

    原理: ARP (Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议.ARP表项可以分为动态和静态两种类型.动态ARP是利用ARP广播报文,动态执行并自动进 ...

  6. 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 ...

  7. 使用Dreamweaver制作简单网站(二)

    继续上周没完成的 一.新建iframe.css 1.点击文件-选择新建-css 2.ctrl+s保存为iframe.css 在style文件夹下. 3.回到main.html 右键选择-附加样式表,选 ...

  8. poj1753 (高斯消元法求异或方程组)

    题目链接:http://poj.org/problem?id=1753 题意:经典开关问题,和poj1222一样,进行两次高斯消元即可,只用初始化的时候改一下初始状态.可能存在无解或多解的情况,多解要 ...

  9. 原生js实现图片的3d效果

    <!doctype html><html lang="en"><head><meta charset="UTF-8"& ...

  10. (四)循环队列 VS 数组队列 (效率对比)

    目录 背景 测试代码 结果 链表 随机访问 背景 各自完成插入 10万.20万 条随机数,然后再将这些随机数出队列 : 测试代码 /** * 测试速度 */ public String testSpe ...