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 ...
随机推荐
- JavaScript学习总结(三)——逻辑And运算符详解
在JavaScript中,逻辑 AND 运算符用双和号(&&)表示 1 var bTrue = true; 2 var bFalse = false; 3 var bResult = ...
- spring boot学习(十三)SpringBoot缓存(EhCache 2.x 篇)
SpringBoot 缓存(EhCache 2.x 篇) SpringBoot 缓存 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManag ...
- hidden="hidden",display:none, visibility:hidden 三者的区别
三者都可以实现隐藏元素的效果 1:display:none 就是把元素隐藏,即在页面上看不到这个元素,并且不占据任何位置 2:hidden="hidden"在页面展示出来效果跟di ...
- PHP:第一章——PHP中的goto语句和
goto语句: <?php header("Content-Type:text/html;charset=utf-8"); /*goto语句:可以代替break*/ //例1 ...
- HeadFirstJava
java执行过程的来龙去脉 源代码——编译器——输出——java虚拟机 扩展名为.java ——扩展名为.class 不要直接用类名点变量来改变属性值,一般都用get.set方法.封装的基本原则:将你 ...
- vector中erase用法注意事项
以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...
- DevExpress v17.2新版亮点—DevExtreme篇(一)
用户界面套包DevExpress DevExtreme v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExtreme v17.2 的New Color Sche ...
- oracle获取执行计划及优缺点 详解
一.获取执行计划的6种方法(详细步骤已经在每个例子的开头注释部分说明了):1. explain plan for获取: 2. set autotrace on : 3. statistics_leve ...
- SEL_CallFuncN,SEL_CallFuncO等的区别
ocos2d-x中有大量的回调函数的应用,主要有以下几类,看下CCObject.h中的定义 typedef void (CCObject::*SEL_SCHEDULE)(float);// 用来调up ...
- HDU 1518 Square(DFS)
Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end ...