30)django-ORM(元信息,级联删除,正反向操作,连表查询优化)
一:元信息
class User(models.Model):
name=models.CharField(max_length,index=True)
email=model.CharField(max_length,index=True)
class meta:
db_table="table_name"#定制表名,默认是app名_表名 #联合索引
index_together=[
("name","email"),
#联合索引支持最左前缀模式(上面单独索引可以不用建立,但是要考虑使用场景。因为单独最后一个字段查询是不能命中)
#select * from where name="xx" 可以命中索引
#select * from where name="xx" and emial="XX"可以命中索引
#select * from where emial="XX" 不能命中索引
#所以这是有代价,最后一个不能命中索引
]
#联合唯一索引,和联合索引又加了限制唯一
unique_together=[()] #admin中显示表的名称
verbose_name #verbose_name加s
verbose_name_plural verbose_name_plural="上课记录" django-admin中显示的是:上课记录s django admin先经过modelform验证,通过了再到model
二:外键级联删除(on_delete属性)
class userType(models.Model);
name=models.CharField(max_length=32) class user(models.Model);
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
... (to="UserType",to_field="id") #delte from UserType where id=1 #原生sql直接报错
UserType.objects.filter(id=1).delete() #默认也会把User表里关联的数据全部删除 #某个场景可以删除,某些不能删除
(to="UserType",to_field="id",on_delete=models.CASCAN)
三:正反向操作
#正反向操作 # 一对多正向操作
# v=User.objects.all()
# for item in v:
# item.name
# item.pwd
# item.ut.name
#User.objects.all().value("user","ut__name") # 一对多反向操作
v=UserType.objects.all()
for item in v:
item.name
item.id
item.user_set.all() # 所有与之关联的User对象 UserType.objects.all().values("name","user__pwd")#通过表名和_返回查询 #上面通过表名反向查找,能不能换个名字
ut=models.ForeignKey(to="UserType",to_field="id",related_name='b',related_query_name='a')#一对多正向操作,这个b可以代替(表名_set)反向操作.related_name='b',related_query_name='a'通过用不到,适用场景自关联 # 一对多反向操作
v=UserType.objects.all()
for item in v:
item.name
item.id
item.user_set.all() # 所有与之关联的User对象 ==item.b.all() UserType.objects.all().values("name","user__pwd")#通过表名返回查询 ==a_pwd
四:性能优化(联表查询)
#性能优化(联表查询)
1)select_related #如果数据库中有10条数据,
users=models.User.objects.all()#仅仅是用户表中的数据
for row in users:
print(row.user,row.pwd,row.ut_id)
print(row.ut.name) #会再发一会SQL请求 #上面相当于做了11次查询,效率不高。,如果外键很多,就跨表执行多次。
users=models.User.objects.all().values('user','pwd','ut__nmae') #只执行一次。但是取到是字典。如果非要是对象。
#再优化
users=models.User.objects.all().select_related() 也是只执行一次,就都取到数据了。但是如果有些不需要跨表(多个外键的时候,只取一个一个外键),可以加参数(这里只能加与外表关联的字段)
users=models.User.objects.all().select_related(“ut”) 2)prefetch_related
#上面如果联表联的多了也不太好,django提供prefetch_related
如:100条数据和3条业务关联了 users=models.User.objects.filter(id__gt=30).prefetch_related(“ut”) #这个不会做联表查询,会做两次sql请求。它会:
#select * from user where id>30
#获取上一步中所有的ut_id=[1,2,3]
#select * from user_type where id in [1,2] 上面都放在内存里面了。django会把两张表里的数据做自动关联。
for row in users:
print(row.user,row.pwd,row.ut_id)
print(row.ut.name)
30)django-ORM(元信息,级联删除,正反向操作,连表查询优化)的更多相关文章
- Django ORM (三) 查询,删除,更新操作
ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...
- python django中的orm外键级联删除
今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: ...
- Django数据库的查看、删除,创建多张表并建立表之间关系
配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGI ...
- Django ORM queryset object 解释(子查询和join连表查询的结果)
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) --- ...
- 【SVN】手动删除svn元信息
工作中当重建svn仓库,需要把之前的项目导入到新的仓库中,熟悉又快捷的方式是项目上右键->Team断开连接->删除元信息,然后项目右键->Team>Share Project- ...
- oracle级联删除
oracle级联删除可以使用触发器来实现,但是比较麻烦,最简单的就是直接建立表的主外键关系,给列设置级联删除. ------创建了CLASS表,并设置ID字段为主键. -- Create table ...
- 「转」sqlalchemy 0.9.8 多对多级联删除
转自知乎 http://www.zhihu.com/question/21050551 有 A,B,C,AB,AC五张表 class A(base): __tablename__ = "a& ...
- Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)
1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...
- Django ORM --- 建表、查询、删除基础
1.什么是ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的 ...
随机推荐
- JAVA方法调用中的解析与分派
JAVA方法调用中的解析与分派 本文算是<深入理解JVM>的读书笔记,参考书中的相关代码示例,从字节码指令角度看看解析与分派的区别. 方法调用,其实就是要回答一个问题:JVM在执行一个方法 ...
- vue 高德地图使用 vue-amap
此插件文档及使用还不错 https://elemefe.github.io/vue-amap/ <template> <div class="amap-page-conta ...
- 【四】Java虚拟机内存区域初识
一.线程独占区 1.程序计数器 程序计数器是一块处于线程独占区较小的内存空间,它可以看是当前线程所执行的字节码的行号指示器. 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码 ...
- 在SQL注入中利用MySQL隐形的类型转换绕过WAF检测
web应用一般采用基于表单的身份验证方式(页面雏形如下图所示),处理逻辑就是将表单中提交的用户名和密码传递到后台数据库去查询,并根据查询结果判断是否通过身份验证.对于LAMP架构的web应用而言,处理 ...
- JS算法练习一
JS算法练习 1.随机生成一个五位以内的数,然后输出该数共有多少位,每位分别是什么? ①.数组添加元素的方式得到位数(数组长度)与值(数组元素) ①.数组添加元素的方式得到位数(数组长度)与值(数组元 ...
- remove() 方法
jQuery的 remove() 方法,去掉选中元素. 例如: $("button").click(function(){ $("p").remove(); } ...
- form表单post提交的数据格式
1.浏览器行为:Form表单提交 action:url 地址,服务器接收表单数据的地址 method:提交服务器的http方法,一般为post和get name:最好好吃name属性的唯一性 enct ...
- 在github上创建自己的项目
使用过很多次github 但一直是把别人的项目clone下来,并没有自己创建过项目.所以记录一下~ 首先,创建一个仓库 填写工程名之后就创建好啦 然后clone代码到本地 就和正常的使用完全一样啦 ~ ...
- 【blog】SpringMVC接收数组
页面 var idsArray = new Array(); idsArray.push(userId); SpringMVC @RequestParam(value = "ids[]&qu ...
- Service Mesh
概念 A service mesh is a dedicated infrastructure layer for handling service-to-service communication. ...