Django QuerySet和中介模型
笔记如下
一.QuerySet
QuerySet是什么?
类似列表里边存着对象
只和ORM有关系
from app01.models import Book
def qDemo(request):
book_list = Book.objects.all()
# 支持切片
print(book_list[1:])
# 支持遍历
for book in book_list:
print(book.id)
# 惰性查询 (保证内存空间最大使用率)
f = open('a.txt', 'r')
for line in f.readlines(): # 一下全拿出来,内存可能装不下
pass
for line in f: # 惰性求值,f充当迭代器对象,用一行取一行
pass
book_list = Book.objects.all()
# 不用book_list。就不会执行sql语句,不走数据库。
# 需要走数据库的操作(取决于用没用book_list里面的数据,即计算查询集)
for book in book_list: # 此时用到了就会走数据库去查询。
print(book)
print(book_list[1])
if book_list:
print('hello')
ret = list(book_list)
# 切片,序列化,缓存 ,list
# 缓存机制
book_list = Book.objects.all()
for book in book_list:
print(book.id)
for book in book_list:
print(book.id)
# 打印两次,只走了一次数据库,查询一次就把结果放到book_list里缓存起来了
book_list = Book.objects.all()
for book in book_list:
print(book.id)
Book.objects.create(title='python')
for book in book_list:
print(book.id)
# 两次用的都是第一次查询缓存的结果,新增的没有被用到。
# 两次都去数据库查询
for book in Book.objects.all():
print(book)
for book in Book.objects.all():
print(book)
# 优化QuerySet的缓存
book_list = Book.objects.all()
if book_list: # 全查询出来,select * from db;
print('里面有记录')
# 上面我只想判断有没有,而他全查出来了
if book_list.exists(): # 只取一条;
print('里面有记录')
# 缓存没问题,但是要限制量,当量非常大的时候怎么办?
# 迭代器!
book_list = Book.objects.all().iterator()
print(type(book_list)) # <class 'generator'>
for book in book_list:
print(book)
# 第二次打印的是空,因为生成器也是迭代器,取出一个少一个。
二.中介模型
class student courst
id name id name id name
1 s1 1 lcg 1 Go
2 ming 2 Python
s_c
id student_id course_id
1 1 1
2 2 1
3 2 2
处理类似的多对多关系时,使用标准的ManyToManyField可以描述关系。
但是,有时你可能需要关联数据(score)到两个模型之间的关系上。
s_c
id student_id course_id score
1 1 1 80
2 2 1 90
3 2 2 100
ORM中介模型:
class Student(models.Model):
name=...
class Course(models.Model):
name=...
students=models.ManyToMany("Student",through="Course_students")
# through告诉ORM我自己去创建第三张表,不必给我自动创建,students这个字段我也用。
class Course_students(models.Model):
student_id=mdoels.ForeignKey("Student")
course_id=mdoels.ForeignKey("Course")
score=models.IntegerFiled()
总结:
QuerySet
惰性查询,缓存机制
查询优化:
if book_list.exists():
pass
缓存优化:book_list = Book.objects.all().iterator()
中介模型 多对多关系中,自己创建第三张表,并且保留关联字段(可使用ORM操作又扩展了第三张表的字段)
students=models.ManyToMany("Student",through="Course_students")
注意:
添加操作:
给python课程添加两个学生aa,bb
if 不是中介模型:
c=Course(name="python")
c.students.add('aa','bb')
if 使用中介模型:
Course_students实例对象的方法创建多对多关系
Django QuerySet和中介模型的更多相关文章
- Django进阶之QuerySet和中介模型
QuerySet QuerySet是查询集,就是传到服务器上的url里面的查询内容.其形态类似于Python的列表,列表中的元素是QuerySet对象.支持大部分列表的内置方法. 可切片 QueryS ...
- model进阶(queryset,中介模型,查询优化,extra)
queryset 方法 ############# 可切片 def queryTest(request): ret = models.Atricle.objects.all() 数据库查询 print ...
- Django【第26篇】:中介模型以及优化查询以及CBV模式
中介模型以及优化查询以及CBV模式 一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' t ...
- Django - 回顾(2)- 中介模型
一.中介模型 我们之前学习图书管理系统时,设计了Publish.Book.Author.AuthorDetail这样几张表,其中Book表和Author表是多对多关系,处理类似这样简单的多对多关系时, ...
- Django框架 之 ORM中介模型
Django框架 之 ORM中介模型 中介模型 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField 就可以了.但是,有时你可能需要关联数据 ...
- django中介模型,CBV模型,及logging日志配制
1.中介模型 中介模型,这个是在我们创建表格时,多对多添加的时候应用到的,通过制定ManyToManyField字段中的through参数来定义,为两者的关系新建一个中介class 为什么会产生这个中 ...
- 中介模型以及优化查询以及CBV模式
一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' title = models.Char ...
- 中介模型,cbv视图,和查询优化
中介模型: 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField 就可以了.但是,有时你可能需要关联数据到两个模型之间的关系上. 例如,有这 ...
- Django-model进阶(中介模型,查询优化,extra,整体插入)
QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. ? 1 >>> Entry.objects.al ...
随机推荐
- VPNl连接
2服务器IP端口及密码在QQ邮箱 OS Reload on localhost.localdomain [95.169.18.222] SSH port: 29657 69.194.13.216 ...
- 系统session超时时间的设置
一个网站系统:当你停止活动一段时间后,系统自动退出 三种方式设置: 1. 在server.xml中定义context时采用如下定义: <Context path="/livsorder ...
- Java——IO类,字节流读数据
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- 《Python》 property、classmethod、staticmethod、isinstance、issubclass
一.property property是一个装饰器函数 装饰器函数的使用方法:在函数.方法.类的上面一行直接@装饰器的名字 装饰器的分类: 1.装饰函数 2.装饰方法:property 3.装饰类 i ...
- Windows XP系统服役13年今正式退休
清明已过,服役13年的微软Windows XP系统也于今日正式“退休”.尽管这之后XP系统仍可以继续使用,但微软不再提供官方服务支持.对于中国数以亿计的XP用户来说,一方面是对已经使用了13年的操作系 ...
- 基于资源名的MVC权限控制
在程序复杂程度不断上升的过程中,无可避免需要触碰到权限控制,而权限控制又与业务逻辑紧紧相关,市场上出现了大量的权限控制产品,而程序的开发,讲究去繁化简的抽象,在我的开发过程中,逐渐发现程序的权限控制核 ...
- scroll事件的优化以及scrollTop的兼容性
scrollTop的兼容性 scroll事件,当用户滚动带滚动条的元素中的内容时,在该元素上面触发.<body>元素中包含所加载页面的滚动条. 虽然scroll事件是在window对象上发 ...
- 使用 Koa + MongoDB + Redis 搭建论坛系统
koa 相对于 express 的优势在于, 1. 使用了 yield generator 封装了co 框架, 使得异步处理, 能像同步那样书写 2. 使用了 中间件 ko-schema, 使得验 ...
- 在Emacs中使用GNU Global
背景 在我平时用Emacs编写C代码时,经常需要进行代码的跳转,主要需求为函数定义的跳转,某个具体函数的调用查找,某个结构体的定义跳转以及结构体中具体某一项的跳转等,GNU Global就能完全满足我 ...
- clipboard.js 实现web端---> 复制到剪切板功能
package.json 中: 添加clipboard 依赖 "dependencies": { "vue": "^2.2.2", &quo ...