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,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的 ...
随机推荐
- memset赋值
比较神奇的事情 可能和二进制有关系吧 #include<bits/stdc++.h> using namespace std; ]; int main(){ memset(f,,sizeo ...
- 课堂测试——jsp登录界面设计
实现结果:在login.jsp页面提交用户名和密码(可以验证是否为空),点击登录跳转到loginResult.jsp页面进行验证并显示结果 JSP + JDBC + MySQL login.jsp 设 ...
- mssql 创建存储过程简单实例
CREATE procedure [dbo].[cp_User_Increment] @channelId int, @currentPage int, @pageSize int, @userId ...
- luogu P2470 [SCOI2007]压缩
传送门 dalao们怎么状态都设的两维以上啊?qwq 完全可以一维状态的说 设\(f[i]\)为前缀i的答案,转移就枚举从前面哪里转移过来\(f[i]=min(f[j-1]+w(j,i))(j\in ...
- PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类
一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...
- 转载-MySQL binlog三种模式及设置方法
原文地址:http://www.cnblogs.com/yangliheng/p/6187327.html 1.1 Row Level 行模式 日志中会记录每一行数据被修改的形式,然后在slave端 ...
- flex布局下overflow失效问题
经常我们会使用flex布局,但是flex布局常常会遇到一些不可思议的麻烦,下面介绍一下overflow遇到的麻烦 我在工作中使用了左右两栏布局 .container { display: flex; ...
- Python之List列表的循环和切片
一.循环(for):输出列表中的每一个元素 stus=['杨静','王志华','王银梅','乔美玲'] #一个个输出列表元素 for s in stus: print('s 是 %s'%s) s 是 ...
- aplication.properties配置
1.设置使用的properties文件 spring.profiles.active=dev 设置激活使用哪个properties一般设置两个,一个是开发环境的,一个是本地的测试环境 可设置默认使用开 ...
- Unicode与Ansi互转
BOOL CTool::AnsiToUnicode(const char *pSrc, CString &strResult) { #ifndef _UNICODE return FALSE; ...