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,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的 ...
随机推荐
- Win10 64位连接LJM1005打印机局域网访问
除了网上常见的开Guest用户之类需要额外三个设置 (1)安装LJM1005驱动LJM1005_Full_Solution (2)设置打印机共享和安全中的everyone全部勾选(解决能看到打印机无法 ...
- 持续集成CI相关的几个概念
持续集成 https://en.wikipedia.org/wiki/Continuous_integration 为什么要持续? 持续集成, 可以避免集成地狱(由于工作的源码 和 库中的源码的差异导 ...
- luogu 2048 超级钢琴 贪心+堆+RMQ
此题求长度在l,r,之间内的区间的前k大之和 1.静态区间第k大,不就是主席树么! 可是不会写啊,以后填坑吧 2.优先队列 固定左端点,选取以此为起点的长度l<=x<=r的区间,固定此范围 ...
- python中执行py文件出错(提示File “<stdin>”,line 1,SyntaxError:invalid syntax)
解决办法: 上图中已通过输入python进入了python运行环境,出现>>>时候的不能再用python z.py 来运行hello.py文件: 应该通过exit()退出当前pyth ...
- CPU火焰图
y轴:栈深度 x轴:cpu时间 长方形:一个栈(方法) 长度:出现在监视器中的时长(占用cpu的时间) 其他:从左到右的顺序只是按字母排序,无其他意义 火焰图就是看顶层的哪个函数占据的宽度最大.只要有 ...
- 连接 sqlserver
提示错误:Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 ...
- Django 学习手册 - 下载数据库表格(XLS/CSV)
下载XLS表格方式: 前置: 需要安装xlwt模块 views : def export_users_xls(request): response = HttpResponse(content_typ ...
- 关于vue2.0 cnpm 镜像安装
前言:这几天安装vue环境一直报错,愁死我了,踩了好多坑,以前学的时候也安装成功了,后来很忙然后一直没顾上学vue,这么最近要学这个 在安装环境中平凡报错特此记笔记如下: 1.首先去下载node.js ...
- 利用jTessBoxEditor工具进行Tesseract-OCR样本训练
jTessBoxEditor依赖java虚拟机 , 所以要先安装 java. jTessBoxEditor下载地址: https://sourceforge.net/projects/vietocr/ ...
- addEventListener() 方法,事件监听
知识点1:addEventListener() 方法,事件监听,可以使用 removeEventListener() 方法来移除事件的监听. 语法 element.addEventListener(e ...