一:元信息

    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(元信息,级联删除,正反向操作,连表查询优化)的更多相关文章

  1. Django ORM (三) 查询,删除,更新操作

    ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...

  2. python django中的orm外键级联删除

    今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: ...

  3. Django数据库的查看、删除,创建多张表并建立表之间关系

    配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGI ...

  4. Django ORM queryset object 解释(子查询和join连表查询的结果)

    #下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) --- ...

  5. 【SVN】手动删除svn元信息

    工作中当重建svn仓库,需要把之前的项目导入到新的仓库中,熟悉又快捷的方式是项目上右键->Team断开连接->删除元信息,然后项目右键->Team>Share Project- ...

  6. oracle级联删除

    oracle级联删除可以使用触发器来实现,但是比较麻烦,最简单的就是直接建立表的主外键关系,给列设置级联删除. ------创建了CLASS表,并设置ID字段为主键. -- Create table ...

  7. 「转」sqlalchemy 0.9.8 多对多级联删除

    转自知乎 http://www.zhihu.com/question/21050551 有 A,B,C,AB,AC五张表 class A(base): __tablename__ = "a& ...

  8. Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)

    1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...

  9. Django ORM --- 建表、查询、删除基础

    1.什么是ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的 ...

随机推荐

  1. ImageView获取宽高

    在Android里放置一个ImageView im1,宽和高都是200.以下代码都是直接在OnCreate里使用. 1.在Android OnCreate里如果直接使用iv.GetWidth()返回值 ...

  2. 子线程导致 Windows 服务停止的情况(Topshelf 结合 Quartz.NET)

    Ø  前言 本文主要记录子线程导致 Topshelf 和 Quartz.NET 的 Windows 服务停止的现象,以及使用几种常用子线程的注意事项.因为我们有时可能需要开启多个线程执行复杂的逻辑,如 ...

  3. 通配符 Globbing赏析

    什么是 Globing? https://www.techopedia.com/definition/14392/globbing   Definition - What does Globbing ...

  4. Hibernate主键生成策略及选择

    1 .increment:适用于short,int,long作为主键,不是使用数据库自动增长机制 这是hibernate中提供的一种增长机制 在程序运行时,先进行查询:select max(id) f ...

  5. AOSP android 源码下载

    (1)下载 repo 工具 mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo-downloads/re ...

  6. CTF 湖湘杯 2018 WriteUp (部分)

    湖湘杯 2018 WriteUp (部分),欢迎转载,转载请注明出处! 1.  CodeCheck(WEB) 测试admin ‘ or ‘1’=’1’# ,php报错.点击登录框下面的滚动通知,URL ...

  7. pyqt5-是否被编辑

    setWindowModified(bool)     被编辑状态,显示*;    没有被编辑,不显示* isWindowModified()              窗口是否是被编辑状态 from ...

  8. luogu P3244 [HNOI2015]落忆枫音

    传送门 md这题和矩阵树定理没半毛钱关系qwq 首先先不考虑有环,一个\(DAG\)个外向树个数为\(\prod_{i=2}^{n}idg_i(\)就是\(indegree_i)\),因为外向树每个点 ...

  9. Spark思维导图之性能优化

  10. DEA和模糊综合评价

    DEA(包络分析) 1.概念 利用多项投入指标和产出指标,利用线性规划的方法,对具有可比性的同类型单位进行有效性评价的一种数量分析方法.以效率的概念作为加总模式,效率等于总产出除以总投入,并以效率最大 ...