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. python之list,tuple,str,dic简单记录(一)

    list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这样python就知道你是在指明一个列表.一旦你创建了一个列表,你就可以添加 ...

  2. Linux 下硬链接和软链接的说明

    Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln 命令产生硬链接. 硬连接 硬连接指通过索引节点来进行连接.在 Li ...

  3. CUDA初试

    1.基本概念 CUDA,全称是Compute Unified Device Architecture,意即统一计算架构,是NVIDIA推出的一种整合技术,开发者可以利用NVIDIA的GeForce 8 ...

  4. Python基础学习(第1天)

    写这篇随笔,是看Vamei大大写的Python快速教程的学习笔记,以此自勉,链接:http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.htm ...

  5. less 应用

    链接           变量传入, 实现不同方向的三角形

  6. mysql中delete的表别名使用方法

    在 mapper.xml 中的 dynamicWhere 动态查询中使用了表别名,Delete 语句引用了动态查询,如下: <delete id="delete" param ...

  7. Git常用命令以及用法

    一 如何让单个文件回退到指定的版本 1.   进入到文件所在文件目录,或者能找到文件的路径 查看整个目录的修改记录 git log . 2.   回退到指定的版本 git reset f7a22076 ...

  8. iOS 单元测试和UI测试教程

    原文:iOS Unit Testing and UI Testing Tutorial 作者:Audrey Tam 译者:kmyhy 编写测试不是为了追求刺激,测试是为了避免你崭新的 App 变成了充 ...

  9. FFmpeg再学习 -- 视音频基础知识

    最近一直在看雷霄骅 FFmpeg 系列视频,然后将自己的理解总结一下. 参看:<基于 FFmpeg + SDL 的视频播放器的制作>课程的视频 一.视频播放器原理 自己理解: 比如一个 M ...

  10. React Native组件(一)组件的生命周期

    相关文章 React Native探索系列 前言 React Native有很多组件比如Image.ListView等等,想要合理的使用组件,首先要先了解组件的生命周期. 1.概述 无论你是开发And ...