文档章节

Django QuerySet 技巧

yehun
 yehun
发布于 2017/03/30 17:17
字数 688
阅读 40
收藏 0

Django下的QuerySet是从对查询返回的结果集, Django会对查询返回的结果集QuerySet进行缓存,这是为了提高查询效率。
也就是说,在你创建一个QuerySet对象的时候,Django并不会立即向数据库发出查询命令,只有在你需要用到这个QuerySet的时候才会这样做

像Entry.Objects.all(),这些操作返回的是一个QuerySet对象,这个对象比较特别,并不是执行Objects.all(),或者filter之后就会与数据库交互, 

具体参看官方文档,与数据库交互的情况:
https://docs.djangoproject.com/en/dev/ref/models/querysets/
Internally, a QuerySet can be constructed, filtered, sliced, and generally passed around without actually hitting the database. No database activity actually occurs until you do something to evaluate the queryset.
可以print queryset对象的query属性查看具体sql

list(Entry.Objects.all())
for e in Entry.Objects.all():pass  
# 便利第一个元素的时候会触发数据库操作
Entry.Objects.all()[2:10] 
# 这种情况不会返回所有元素,sql中会加上limit的,分页可以利用这一点

Q和F

F class
from django.db.models import F

Instances of F() act as a reference to a model field within a query. These references can then be used in query filters to compare the values of two different fields on the same model instance.
这就是说F是专门取对象中某列值的,例子: 'QuerySet 判断一个model两个字段是否相等'

Q class
from django.db.models import Q

Keyword argument queries – in filter(), etc. – are “AND”ed together. If you need to execute more complex queries (for example, queries with OR statements), you can use Q objects.
从文档把Q放在Complex lookups with Q objects,下就可以看出,Q是做复杂查询的 

示例:

and --> XX.objects.filter(Q(f=1),Q(f=2))    # 肯定木有结果 f == 1 and f == 2
or   --> XX.objects.filter(Q(f=1) | Q(f=2))  # f ==1 | f == 2
not --> XX.objects.filter(~Q(f=1),Q(f=2))  # f != 1 and f == 2

判断某字段是否为null

_tasks = tasks.exclude(group__isnull=True)

各种双下滑线对应的各种方法,参看文档 querysets field lookup 
https://docs.djangoproject.com/en/1.6/ref/models/querysets/#field-lookups 
 

QuerySet !=


例如model 有两列 一列叫做user,一列叫做assigned_user, 
需求是取出user!=1的记录,django里面不能使用!=,需要用Q

from django.db.models import Q
direct_comment = _tasks.filter(~Q(user=1))

Q还可以这样,user = 1或者2的元素

direct_comment = _tasks.filter(Q(user=1) | Q(user=2))

QuerySet 判断一个model两个字段是否相等

from django.db.models import F
#例如model 有两列 一列叫做user,一列叫做assigned_user,
#需求是取出user=assigned_user的记录
direct_comment = _tasks.filter(user=F('assigned_user'))

django group_by

对某些取到的QuerySet分组还是很常见的 

def group_by(query_set, group_by):
    '''util:django 获取分类列表'''
    assert isinstance(query_set, QuerySet)
    django_groups = query_set.values(group_by).annotate(Count(group_by))
    groups = []
    for dict_ in django_groups:
        groups.append(dict_.get(group_by))
    return groups
#例如:
#assign_to = _tasks.exclude(user=F('assigned_user'))
#groups = group_by(assign_to, 'group')
#取出的是一个列表groups = [1L, 3L, 4L]

http://git.oschina.net/duoduo3_69/skill_issues/blob/master/django.issue.md

© 著作权归作者所有

yehun
粉丝 8
博文 218
码字总数 137315
作品 0
长宁
高级程序员
私信 提问
Django REST framework的各种技巧——5.搜索

restframework内置了一些搜索功能,可以快速的实现搜索 Django REST framework的各种技巧【目录索引】 写在上面 所有的代码都是在下面的两个版本来做的 查询 我们经常要做一些查询的东东,大...

duoduo3_69
2016/02/01
226
0
django QuerySet里那些常用又不常见的技巧

最近的作业是django rest,业务有点复杂,因此model部分会有各种查询,有些确实之前很少用到的东西,向Q,F,这都是毛啊 QuerySet 像Entry.Objects.all(),这些操作返回的是一个QuerySet对象,...

duoduo3_69
2014/02/12
9.9K
2
Django REST framework的各种技巧——4.Generic View

generic view是django神奇的地方,而restframework遵循了这个powerful的机制 Django REST framework的各种技巧【目录索引】 写在上面 所有的代码都是在下面的两个版本来做的 一个之前的blog,...

D咄咄
2017/11/29
0
0
Django REST framework的各种技巧——4.Generic View

generic view是django神奇的地方,而restframework遵循了这个powerful的机制 Django REST framework的各种技巧【目录索引】 写在上面 所有的代码都是在下面的两个版本来做的 一个之前的blog,...

duoduo3_69
2016/02/01
198
0
Django QuerySets : 真他妈棒?

Django的QuerySets酷毙了! 在本文中我将解释一下QuerySets是什么,它是如何工作的(如果你对它已经熟悉了,你可以直接跳到第二部分),我认为如果可以的话你应该总是返回QuerySets对象,下面...

renwofei423
2013/07/29
13.7K
44

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部