queryset 方法

 #############  可切片
def queryTest(request):
ret = models.Atricle.objects.all() 数据库查询
print[1] pring[0:2] ############# 可迭代
def queryTest(request):
ret = models.Atricle.objects.all() 数据库查询
for i in ret:
print(i.title) ############# 惰性查询
def queryTest(request):
ret = models.Atricle.objects.all()
for i in ret:
print(i.title)
if ret:
print('ok')
print(ret[2]) 当我们把循环注销,是不会查询的,就是不用不查,可以看mysql.log
if ret , print , ret[2]用到了就会走查询,需要求值的时候
跟迭代器,生成器一样的,不用不会查询的 ############# 缓存机制
def queryTest(request):
ret = models.Atricle.objects.all() 数据库查询
for i in ret:
print(i.title)
for i in ret:
print(i.title)
queryset有自己的缓存机制,数据库查询一次,for循环2次,第一次打开
数据库后,就把ret保存在queryset缓存里面 ############# iterator()方法
如果查询的内容太多,内存肯定吃不消,就有了iterator()方法,迭代器
def queryTest(request):
ret = models.Atricle.objects.all().iterator() 数据库查询
for i in ret:
print(i.title)
for i in ret:
print(i.title) 走一次查询,一次for循环,第二次没有了
这样的话就不能使用2次for循环,第一次循环有一条拿一条不会保存在内存里了,用一次拿一次 ############# 优化exists()
exists()不管里面有多少条,只取一条
def queryTest(request):
ret = models.Atricle.objects.all() 数据库查询
if ret:
这样是查询了所有结果 if ret.exists():
这样只是查询一条

中介模型:

针对多对多关系,虽然可以自动创建关联表,但是需求是想要加入一些字段信息呢,这就需要自己手动建关联表了

对于这些情况,Django 允许你指定一个中介模型来定义多对多关系。 你可以将其他字段放在中介模型里面。源模型的ManyToManyField 字段将使用through 参数指向中介模型

models

 from django.db import models

 class Person(models.Model):
name = models.CharField(max_length=128) def __str__(self):
return self.name class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership') # through 指定关系表 def __str__(self):
return self.name class Membership(models.Model):
person = models.ForeignKey(Person) # 外键写上
group = models.ForeignKey(Group) # 外键写上
date_joined = models.DateField() # 需求添加的额外外键
invite_reason = models.CharField(max_length=64) # 需求添加的额外外键

注意事项:

     绑定关系的时候,与普通的多对多字段不同,你不能只创建 Person和 Group之间的关联关系,你还要指定 Membership模型中所需要的所有信息;而简单的add、create 和赋值语句是做不到这一点的。
所以,你只实例化的时候,通过create来创建
m2 = Membership.objects.create(person=paul, group=beatles,
... date_joined=date(1960, 8, 1),
... invite_reason="Wanted to form a band.") clear() 方法却是可用的。它可以清空某个实例所有的多对多关系:beatles.members.clear()
# Note that this deletes the intermediate model instances
Membership.objects.all()
[]

查询优化:select_related

select_related就是join表,就成了一张表

 # 查询 主键等于2的文章的所属分类名称
obj = models.Article.objects.filter(nid=2) # 撞击数据库,查询nid=2的文章
print(obj.category.title) # 再次撞击数据库 ret=models.Article.objects.filter(nid=2).values("category__title") 一次数据库
print(ret) select_related 就是join一张表,left inner join是一样的效果,以左边为主 right join,以右边为主
obj_list=models.Article.objects.select_related("user").select_related("category").all() # 撞击数据库 可以join多章表,也可以写在一个里面,逗号隔开
for obj in obj_list:
print(obj.category.title)

extra 函数

语法格式:

extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)

有些情况下,Django的查询语法难以简单的表达复杂的 WHERE 子句,extra可以指定一个或多个 参数,例如 selectwhere or tables. 这些参数都不是必须的,但是你至少要使用一个!

 select:简单查询
queryResult=models.Article.objects.extra(select={'is_recent': "create_time > '2017-09-05'"})
结果集中每个 Entry 对象都有一个额外的属性is_recent, 它是一个布尔值,表示 Article对象的create_time 是否晚于2017-09-05. article_obj=models.Article.objects
     .filter(nid=1)
     .extra(select{"standard_time":"strftime('%%Y%%m%%d',create_time)"}).values("standard_time","nid","title")
print(article_obj)
# <QuerySet [{'title': 'MongoDb 入门教程', 'standard_time': '2017-09-03', 'nid': 1}]> 参数之where / tables:简单条件查询
您可以使用tables手动将表添加到SQL FROM子句,where和tables都接受字符串列表
queryResult=models.Article.objects.extra(where=['nid in (1,3) OR title like "py%" ','nid>2'])
## table连接其它表
# SELECT * FROM myapp_book, myapp_person WHERE last = author_last
Book.objects.all().extra(table=['myapp_person'], where=['last = author_last']) # 加from后面

model进阶(queryset,中介模型,查询优化,extra)的更多相关文章

  1. 第十四篇Django-model进阶(中介模型,查询优化,extra,整体插入)

    Django-model进阶(中介模型,查询优化,extra,整体插入) 阅读目录(Content) 中介模型 查询优化 extra 整体插入 中介模型 处理类似搭配 pizza 和 topping ...

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

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

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

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

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

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

  5. Django QuerySet和中介模型

    笔记如下 一.QuerySet QuerySet是什么? 类似列表里边存着对象 只和ORM有关系 from app01.models import Book def qDemo(request): b ...

  6. Django model进阶

    Django-model进阶   QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Ent ...

  7. Django——model进阶(待完成)

    https://www.cnblogs.com/yuanchenqi/articles/7570003.html 一.QuerySet 1.可切片 使用Python 的切片语法来限制查询集记录的数目  ...

  8. DAY19-Django之model进阶

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

  9. 07.Django学习之model进阶

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

随机推荐

  1. 求中位数,O(n)的java实现【利用快速排序折半查找中位数】

    查找无序数组的中位数,要想时间复杂度为O(n)其实用计数排序就能很方便地实现,在此讨论使用快速排序进行定位的方法. 1.中位数定义 2.算法思想 3.Java代码实现 4.时间复杂度分析 5.附录 中 ...

  2. 20165332实验一 Java开发环境的熟悉

    实验一 Java开发环境的熟悉 一.Java开发环境的熟悉-1 1.实验要求: 0 参考实验要求: 1 建立"自己学号exp1"的目录 : 2 在"自己学号exp1&qu ...

  3. Linux:安装git

    1.下载 https://www.kernel.org/pub/software/scm/git/git-2.9.4.tar.gz 2.解压 tar zxvf git-2.9.4.tar.gz cd  ...

  4. hdu 5265

    http://acm.hdu.edu.cn/showproblem.php?pid=5256 题目不错,题面忍不住骂一句mmp.......后面说ai都是正整数,我以为修改后也必须是正整数,前面又说只 ...

  5. OSI七层模型及应用

    应用层:提供访问网络服务的接口.例如telnet. 表示层:提供数据格式转化服务.例如压缩和解压缩. 会话层:提供回话实体的连接服务,进行访问验证和会话管理.例如服务器验证用户登录和断点续传. 传输层 ...

  6. Apache Samza流处理框架介绍——kafka+LevelDB的Key/Value数据库来存储历史消息+?

    转自:http://www.infoq.com/cn/news/2015/02/apache-samza-top-project Apache Samza是一个开源.分布式的流处理框架,它使用开源分布 ...

  7. 【ccf2017-12-2】游戏(模拟)

    问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1号小朋 ...

  8. SPI笔记

    sclk(serial clock):串行时钟 MOSI(master out slave input)  (master   主机) (slave 从机) MISO(master int slave ...

  9. Struts2 用过滤器代替了 servlet ,???? 且不需要tomcat就可以直接做功能测试

    Struts2  用过滤器代替了 servlet ,????  且不需要tomcat就可以直接做功能测试

  10. EasyDSS流媒体服务器出现no compatible source was found for this media问题的解决

    在EasyDSS流媒体服务器的客户反馈中,我们遇到这样一个现象,在chrome中经常会出现RTMP/HLS流无法播放的问题: 这个问题复现的几率比较低,因为chrome禁止了flash的加载,这也从另 ...