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. 解决socket负载均衡集群方案和代码实现

    有一段时间,在考虑下socket 之间集群 可以在Nginx 下可以 但是不同服务器之间怎么通讯呢 后来自己也想可不可以用什么东西或者中间件来通讯 ,后来在百度之下 发现果然就是按照我所想的 ,在网上 ...

  2. 51nod 1383 母函数

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1383 一眼望去,不就是硬币兑换吗,母函数或者dp,直接暴力dp就A了,不 ...

  3. IOS-通讯录

    一.通讯录简介 iOS提供了AddressBook.framework框架,允许开发者与设备中的通讯录进行数据交互   二.查询授权状态 可以调用ABAddressBookGetAuthorizati ...

  4. elementUI表格合并单元格

    相信你肯定看了 ElementUI 官方文档了,没看的话先去看下表格各个属性的意义,方便下文阅读:传送门 但你会发现此例过于简单,死数据,但我们开发的时候往往都是后台传递过来的数据,导致我们 rows ...

  5. ASM9260T开发板使用

    ifconfig eth0 192.168.1.66 netmask 255.255.255.0 up   //设备iproute add default gw 192.168.1.1   //添加网 ...

  6. ZOJ 3204 Connect them(最小生成树+最小字典序)

    Connect them Time Limit: 1 Second      Memory Limit: 32768 KB You have n computers numbered from 1 t ...

  7. 内存保护机制及绕过方案——利用未启用SafeSEH模块绕过SafeSEH

    前言:之前关于safeSEH保护机制的原理等信息,可在之前的博文(内存保护机制及绕过方案中查看). 利用未启用SafeSEH模块绕过SafeSEH ⑴.  原理分析: 一个不是仅包含中间语言(1L)且 ...

  8. FlashDevelop安装配置

    1.下载 FlashDevelop,flash sdk,flash sdk debug,.net framework,java sdk(32位,不管机器是多少位,否则不能单步调试的) 2.  安装Fl ...

  9. Django 常见的异常

    Django 常见的异常 1 'WSGIRequest' object has no attribute 'user' Django版本的问题,1.10之前,中间件的key为MIDDLEWARE_CL ...

  10. json 和 table控件

    <!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" content= ...