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. 从互信息的角度来理解tf-idf

    先介绍tf idf 在一份给定的文件里,词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率.这个数字是对词数(term count)的归一化,以防止它偏向长的文件.( ...

  2. 安装Charles报错

    去年用的是charles4.1.2版本,今年这个版本的安装包始终安装报错,不管公司电脑还是自己电脑........ 我的解决方案很Lower的.......... 登录Charles官网:https: ...

  3. sql语句遇到错误: The used SELECT statements have a different number of columns :

    这是因为使用union的两个SQL语句产生的记录的表结构不一致. 必须是结构完全一致的记录集合才可以使用UNION. 以上就是两个表的字段不一样,导致,所以大家可以检查下.

  4. dojo学习教程

    Dojo 作为最著名的 Ajax 开源项目之一,不仅让 Web 程序员可以免费获得和使用其框架进行 Web 应用的开发,更吸引了大量的开发者对其不断的扩充,开发新的组件.DojoX 就是在这样的开发社 ...

  5. DRF 用户频率限制

    DRF 用户频率限制 为什么要限流 1 防爬虫 匿名用户 无法限制,代理 已登录,用户名限制:买代理 2 提供服务(接口--不同用户的访问次数不一样) vip 限制访问次数 BaseThrottle ...

  6. C# 为什么用接口实例化一个实现该接口的类?

    这是多态的体现. 首先接口不能实例化的. 实现接口的类 实例 = new 实现接口的类()// 这样用不好吗? //这样已经不是好不好的问题了,这样的话,要接口有什么用?//用接口就是让实例和实现类的 ...

  7. jquery自定义插件实现分页效果

    这节介绍如何自定义jquery插件,实现分页效果,话不多说,先看看实现的效果: 分页插件 实现的代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM ...

  8. Visual Studio和Sublime Text全系列激活码

    自己经常用,做个备份 VS2012 Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥: YKCW6-BPFPF-BT8C9-7DCTH-QXGWC Mi ...

  9. centOS 7 tomcat nginx 验证码乱码

    将服务部署在centOS 7上,配置完tomcat和nginx之后,启动服务后,发现验证码这样了~~~ 一开始是以为nginx的原因,但是在Ubuntu系统相同操作发现没有问题,后发现,系统的字体库中 ...

  10. 【转】程序员应该了解的——除了coding我们还有很多事要做

    from : http://www.cnblogs.com/lingyun1120/archive/2011/10/09/2203306.html try { if (you.believe(it) ...