模型层字段-多表查询-神奇的双下划线查询-F,Q查询
Django ORM中常用的字段和参数
常用字段
AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
CharField
字符类型,必须提供max_length参数, max_length表示字符长度。
DateField
日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField
日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
TextField(Field)
- 文本类型
用来存大段文本
FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 用户上传的文件会自动放到等号后面指定的文件路径中
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
书写格式一般如下:
自定义对应于数据库的char类型
然后在model.py里建表模型的时候可以直接应用:
字段参数
null
用于表示某个字段可以为空。
unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。
DateField和DateTimeField
auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
关系字段
ForeignKey
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
字段参数
to
设置要关联的表
to_field
设置要关联的表的字段
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
删除关联数据,与之关联也删除
db_constraint
是否在数据库中创建外键约束,默认为True。
常用的多表关系查询的外键字段创建
一对一字段:OneToOneField
多对多字段:ManyToManyField
一对多字段:ForeignKey
针对外键字段
当你在使用django2.x版本的时候,建外键字段时,需要手动添加几个关键字段参数
models.cascade
db_constraints
Django终端打印SQL语句
把参数放在settings.py配置文件中,会在终端打印出相应的mysql查询语句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
配置好之后,再执行任何对数据库进行操作的语句时,会自动将Django执行的sql语句打印到pycharm终端上
也可以用.query大方式查看查询语句:
13个必会操作总结
返回QuerySet对象的方法有
all()
filter()
exclude()
order_by()
reverse()
distinct()
特殊的QuerySet
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元祖序列
返回具体对象的
get()
first()
last()
返回布尔值的方法有:
exists()
返回数字的方法有
count()
神奇的双下滑查询
对应MySQL的查询语句形成对比记忆,方法和查询的方法类似
# 价格 大于 小于 大于等于 小于等于
filter(price__gt='')
filter(price__lt='')
filter(price_gte='')
filter(price_lte='') # 存在与某几个条件中
filter(price__in=['','',''])
# 在某个范围内
filter(price__range=[50,90]) # 模糊查询
filter(title__contains='西')
filter(title__icontains='P') # 以什么开头 以什么结尾 # 按年查询
filter(create_time__year='')
多表查询:跨表查询,连表查询
书写测试代码脚本:
一对多的字段的增删改查
增操作:关键字 create
改操作:关键字 update
查数据:常用的13种
# < 1 > all(): 查询所有结果
# < 2 > filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 # < 3 > get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
# 如果符合筛选条件的对象超过一个或者没有都会抛出错误。(源码就去搂一眼~诠释为何只能是一个对象)
# < 4 > exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
# < 5 > order_by(*field): 对查询结果排序('-id') / ('price')
# < 6 > reverse(): 对查询结果反向排序 >> > 前面要先有排序才能反向
# < 7 > count(): 返回数据库中匹配查询(QuerySet)
# 的对象数量。
# < 8 > first(): 返回第一条记录
# < 9 > last(): 返回最后一条记录
# < 10 > exists(): 如果QuerySet包含数据,就返回True,否则返回False
# < 11 > values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
# model的实例化对象,而是一个可迭代的字典序列
# < 12 > values_list(*field): 它与values()
# 非常相似,它返回的是一个元组序列,values返回的是一个字典序列 # < 13 > distinct(): 从返回结果中剔除重复纪录
# # 必须完全一样才可以去重(意味着带了id就没有意义了)
# # res = models.Book.objects.all().values('name').distinct() 先查一个重复的值再去重
# 查询书籍名字中包含p的
"""原生sql语句 模糊匹配
like % _
"""
# res = models.Book.objects.filter(title__contains='p') # 仅仅只能拿小写p
# res = models.Book.objects.filter(title__icontains='p') # 忽略大小写
删除操作: delete
多对多字段的增删改查
增操作:add()
add():添加操作,括号内既可以传数字也可以传对象,并且支持一次性传多个,逗号隔开即可
改操作:set()
set()括号内需要传一个可迭代对象,可迭代对象中,可以是多个数字组合,也可以是多个对象组合,但不能 混合使用
删除操作:remove()
remove() 括号内既可以传数字,也可以传对象,并且支持传多个,逗号隔开即可.
清空操作:clear(),括号内不需要传任何参数
跨表查询
1.对象查找(跨表)
语法:
对象.关联字段.字段
要点:先拿到对象,再通过对象去查对应的外键字段,分两步
示例:
book_obj = models.Book.objects.first() # 第一本书对象(第一步)
print(book_obj.publisher) # 得到这本书关联的出版社对象
print(book_obj.publisher.name) # 得到出版社对象的名称
2.字段查找(跨表)
语法:
关联字段__字段
要点:利用Django给我们提供的神奇的双下划线查找方式
models.Book.objects.all().values("publisher__name")
#拿到所有数据对应的出版社的名字,神奇的下划线帮我们夸表查询
反向操作(两种方式)
1.对象查找
语法:
obj.表名_set
要点:先拿到外键关联多对一,一中的某个对象,由于外键字段设置在多的一方,所以这里还是借用Django提供的双下划线来查找
publisher_obj = models.Publisher.objects.first() # 找到第一个出版社对象
books = publisher_obj.book_set.all() # 找到第一个出版社出版的所有书
titles = books.values_list("title") # 找到第一个出版社出版的所有书的书名
正向与反向的概念
口诀"正向查询按外键字段,反向查询按表名小写"
# 跨表查询(***)
"""
正向与反向的概念 # 一对一
# 正向:author---关联字段在author表里--->authordetail 按字段
# 反向:authordetail---关联字段在author表里--->author 按表名小写 # 一对多
# 正向:book---关联字段在book表里--->publish 按字段
# 反向:publish---关联字段在book表里--->book 按表名小写_set.all() 因为一个出版社对应着多个图书 # 多对多
# 正向:book---关联字段在book表里--->author 按字段
# 反向:author---关联字段在book表里--->book 按表名小写_set.all() 因为一个作者对应着多个图书 正向查询按外键字段
反向查询按表名小写 """
"""基于对象的跨表查询(子查询:将一张表的查询结果当做另外一个查询语句的条件)"""
"""
例题:
1.查询书籍id是1 的出版社名称
book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.publish.name)
print(book_obj.publish.addr)
2、查询书籍id是2 的作者姓名
# book_obj = models.Book.objects.filter(pk=2).first()
print(book_obj.authors) # app01.Author.None
# print(book_obj.authors.all())
# res = book_obj.authors.all()
# for r in res:
# print(r.name)
3、查询出版社是东方出版社出版的书籍
publish_obj = models.Publish.objects.filter(name='东方出版社').first()
print(publish_obj.book_set) # app01.Book.None
print(publish_obj.book_set.all())
4、查询电话号码是130的作者姓名
author_detail_obj = models.AuthorDetail.objects.filter(phone=130).first()
print(author_detail_obj.author.name)
print(author_detail_obj.author.age)
当你反向查询的结果是多个的时候 就需要加_set,否则直接表明小写即可
基于双下划线的跨表查询(连表操作)
联想MySQL:left join 左连接,inner join 内连接,right 右连接,union 全连接
1、查询jason作者的手机号
2、查询手机号是130的作者年龄
3、查询书籍id=1的作者的电话号码
4、查询北方出版社出版的价格大于19的书
聚合查询
关键字:aggregate ,类似mysql的聚合函数,最大值,最小值,平均值,总计,sum(总数)
from django.db.models import Max,Min,Count,Avg,Sum
1、统计所有书的总价格
分组查询
结合聚合函数+()使用,关键字:annotate
1、统计每一本书的作者个数
2、统计出每个出版社卖的最便宜的书的价格
3、统计不止一个作者的图书
F查询:
F是个模块,需要导入使用
F查询的本质就是从数据库中获取某个字段的值来进行一系列的操作
1、查询库存数大于卖出的书籍
2、将书籍库存数全部增加100
3、把所有书名后面加上“新款“
拼接需要导入模块:Conact、Value
Q查询:
Q也是一个模块需要导入,才能使用
进行与或非等复杂的组合操作( |,&,&~Q,~(非))
filter() 等方法中逗号隔开的条件是与的关系。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。
例子:查询书籍名称是三国演义或者价格是444.44
Q的高级用法:
更改查询中的条件,用q.connector修改括号内的属性
模型层字段-多表查询-神奇的双下划线查询-F,Q查询的更多相关文章
- Django之单表查询——神奇的双下划线
1.filter中的单表查询 # 查询id>1且id<4的结果 ret = models.Person.objects.filter(id__gt=1,id__lt=4) print(re ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- Python--day69--单表查询之神奇的双下划线
单表查询之神奇的双下划线: 单表查询之神奇的双下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 models. ...
- django 神奇的双下划线,通过外键的三种查询方式
一,用于跨表操作 只要是object后面字符串都是用双下划线__.其它地方用点. 如:的values中的group_code__name.group_code是一个外键 def list(reques ...
- Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段
单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...
- Django模型层(各种表及表数据的操作)
目录 一.Django模型层 0. django模型层的级联关系 1. 配置django测试脚本 (1)方式一 (2)方式二 2. orm表数据的两种增删改 (1)方式一: (2)方式二: 3. pk ...
- day 70 Django基础五之django模型层(二)多表操作
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...
- day 56 Django基础五之django模型层(二)多表操作
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...
随机推荐
- Canvas基本定义
Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.今天我们主要要了解的是2D相关的 大部分2D使用的api都在android.g ...
- 三、CI框架之一个最简单的页面
一.在CI框架里面的controllers <?php defined('BASEPATH') OR exit('No direct script access allowed'); class ...
- hihocoder:#1082 : 然而沼跃鱼早就看穿了一切(用string)
题目是这样的: 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼("marshtomp",不区分大小写).为了使句子不缺少成分, ...
- 第一章:MySQL架构和历史
1.MySQL逻辑架构 MySQL存储引擎架构:将查询处理以及其他任务系统和数据的存储处理分离开来,这样做的好处在于可以根据需要灵活选择存储引擎. 第一层架构 -- 连接处理.授权认证.安全等. 第二 ...
- [XNUCA2019Qualifier]EasyPHP
0x00 知识点 预期解中知识点: htaccess生效 如果尝试上传htaccess文件会发现出现响应500的问题,因为文件尾有Just one chance 这里采用# \的方式将换行符转义成普通 ...
- jquery ajax常用的登录登出
整理jquery+ajax的登录登出方法. //登录 var currentUserId = -1; $(function() { var timestamp = (new Date()).value ...
- 转载电子发烧友网---STM32的IO口灌入电流和输出驱动电流
刚开始学习一款单片机的时候一般都是从操作IO口开始的,所以我也一样,先是弄个流水灯. 刚开始我对STM32的认识不够,以为是跟51单片机类似,可以直接操作端口,可是LED灯却没反应,于是乎,仔细查看资 ...
- 题解 P1220 【关路灯】
区间DP, 考虑设\(dp[i][j][t]\)为已经关掉了\([i,j]\)的电灯, 人在t端点处时的最小代价 可以推出方程: \[ dp[i+1][j][0]+(p[n]-p[j]+p[i])*( ...
- URL&HTTP协议详解
本文来自公开课笔记,主要做知识的记录,谢谢! ·接口测试核心技术--URL&HTTP协议详解. ·URL: 统一资源定位符. 示例: https://ke.qq.com/course/3157 ...
- 洛谷 P1709 隐藏口令
题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并 ...