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. codeforces 816B.Karen and Coffee 解题报告

    题目链接:http://codeforces.com/contest/816/problem/B 题目意思:给出 n 个recipes,第 i 个(1<= i <=n)recipes 表明 ...

  2. python学习笔记(requests)

    昨天用jmeter尝试了下接口测试 在部分接口中要上传文件这里遇到了问题.今天改用python的requests框架试下 先简单的写了个登录的接口.本人初学者,第一次写接口脚本 #!/usr/bin/ ...

  3. 交换机上的trunk,hybrid,access配置和应用(转)

    交换机上的trunk,hybrid,access配置和应用 以太网端口的链路类型: Access类型:端口只能属于一个vlan,一般用于连接计算机. Trunk类型:端口可以属于端个vlan,可以接收 ...

  4. Django进阶Model篇001 - mysql 数据库的配置

    django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见: https://docs.djangop ...

  5. oracle内存分析

    oracle时间内存=SGA+PGA SGA(System Global Area):由所有服务进程和后台进程共享: PGA(Program Global Area):由每个服务进程.后台进程专有:每 ...

  6. 20165210 Java第五次实验报告

    20165210 实验五 网络编程与安全 网络编程与安全一: 实验要求: 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA ...

  7. PhotoShop脚本指南

    Photoshop脚本语言 Photoshop支持三种脚本语言:AppleScript,VBScript,JavaScript.其中AppleScript为苹果系统,VBScript为Windows操 ...

  8. 软件测试 Record

    fxcopnunit软件质量 EDW 数据仓库ETL KPI 敏捷 测试计划 单元测试 集成测试 系统测试 对测试结果 阶段性 分析 总结 测试结果报告 环境问题:软硬件用户有问题,我们这边没有有效问 ...

  9. onsubmit对表单的拦截

    今天遇到一个问题:在对同name 的input 表单时 判断其值是否有效 用了each判断 当初错误的做法: function check_goods() { var regs = /^\d+$/; ...

  10. 瀑布流下滑 发送ajax

    <!DOCTYPE=html>      <html>      <head>      <meta charset="UTF-8"> ...