笔记如下

一.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和中介模型的更多相关文章

  1. Django进阶之QuerySet和中介模型

    QuerySet QuerySet是查询集,就是传到服务器上的url里面的查询内容.其形态类似于Python的列表,列表中的元素是QuerySet对象.支持大部分列表的内置方法. 可切片 QueryS ...

  2. model进阶(queryset,中介模型,查询优化,extra)

    queryset 方法 ############# 可切片 def queryTest(request): ret = models.Atricle.objects.all() 数据库查询 print ...

  3. Django【第26篇】:中介模型以及优化查询以及CBV模式

    中介模型以及优化查询以及CBV模式 一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' t ...

  4. Django - 回顾(2)- 中介模型

    一.中介模型 我们之前学习图书管理系统时,设计了Publish.Book.Author.AuthorDetail这样几张表,其中Book表和Author表是多对多关系,处理类似这样简单的多对多关系时, ...

  5. Django框架 之 ORM中介模型

    Django框架 之 ORM中介模型 中介模型 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField  就可以了.但是,有时你可能需要关联数据 ...

  6. django中介模型,CBV模型,及logging日志配制

    1.中介模型 中介模型,这个是在我们创建表格时,多对多添加的时候应用到的,通过制定ManyToManyField字段中的through参数来定义,为两者的关系新建一个中介class 为什么会产生这个中 ...

  7. 中介模型以及优化查询以及CBV模式

    一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' title = models.Char ...

  8. 中介模型,cbv视图,和查询优化

    中介模型: 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField  就可以了.但是,有时你可能需要关联数据到两个模型之间的关系上. 例如,有这 ...

  9. Django-model进阶(中介模型,查询优化,extra,整体插入)

    QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. ? 1 >>> Entry.objects.al ...

随机推荐

  1. javascript开发HTML5游戏--斗地主(单机模式part1)

      最近学习使用了一款HTML5游戏引擎(青瓷引擎),并用它尝试做了一个斗地主的游戏,简单实现了单机对战和网络对战,代码可已放到github上,在此谈谈自己如何通过引擎来开发这款游戏的. 客户端代码 ...

  2. POJ 3352 Road Construction 双联通分量 难度:1

    http://poj.org/problem?id=3352 有重边的话重边就不被包含在双连通里了 割点不一定连着割边,因为这个图不一定是点连通,所以可能出现反而多增加了双连通分量数的可能 必须要用割 ...

  3. MySQL主从数据一致性问题修复

    MySQL主从数据一致性问题修复 前面,我们使用pt-table-checksum 可以检测出主从数据是否一致的问题.发现问题后,我们怎么解决这些问题,也是我们必须要会的技能. 修复主从数据一致性问题 ...

  4. Samsung_tiny4412(驱动笔记07)----spinlock,semaphore,atomic,mutex,completion,interrupt

    /*********************************************************************************** * * spinlock,se ...

  5. How to convert int [12] to array<int, 12>

    code: // array::data #include <iostream> #include <cstring> #include <array> int m ...

  6. POJ 2312:Battle City(BFS)

    Battle City Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9885   Accepted: 3285 Descr ...

  7. Elasticsearch 索引的全量/增量更新

    Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...

  8. HDU 4638 树状数组 想法题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 解题思路: 题意为询问一段区间里的数能组成多少段连续的数.先考虑从左往右一个数一个数添加,考虑当 ...

  9. 2018-2019-2 网络对抗技术 20165212 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165212 Exp4 恶意代码分析 原理与实践说明 1.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或E ...

  10. 一篇文章入门Jmeter性能测试【经典长文】

    孟船长  目录 1.性能测试定义2.为什么要做性能测试3.性能测试指标.性能测试分类4.Jmeter性能测试实战[入门级]5.参考文章链接 1.性能测试定义 百度&知乎 性能测试是通过自动化的 ...