django QuerySet里那些常用又不常见的技巧
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 1. list(Entry.Objects.all())
2. for e in Entry.Objects.all():pass
# 便利第一个元素的时候会触发数据库操作
3. 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]
django QuerySet里那些常用又不常见的技巧的更多相关文章
- 转一篇:文档笔记之Django QuerySet
这个放着,说不定以后作一些更深入的查询时,用得着的. http://www.rapospectre.com/blog/7/ 今天刚刚答完辩体完检就跑来更新博客了!!! 先补上第一篇: 一般情况下,我们 ...
- Django学习笔记之Django QuerySet的方法
一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get.filter.exclude.delete神马的感觉就已经无所不能了,但随着项目但业 ...
- Django QuerySet 进阶
QuerySet 进阶 阅读本文你可以学习到什么 1. 查看 Django queryset 执行的 SQL(1部分) 2. 获得的查询结果直接以类似list方式展示(2,3 部分) 3. 如何在dj ...
- Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静态文件的加载load static),自定义simple_tag和inclusion_tag
Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静 ...
- django入门7之django template和xadmin常用技巧
django入门7之django template和xadmin常用技巧 <li {% ' == '/course' %}class="active"{% endif %}& ...
- 合并多个python list以及合并多个 django QuerySet 的方法
在用python或者django写一些小工具应用的时候,有可能会遇到合并多个list到一个 list 的情况.单纯从技术角度来说,处理起来没什么难度,能想到的办法很多,但我觉得有一个很简单而且效率比较 ...
- tcpdump常用参数说明及常见操作
tcpdump常用参数说明及常见操作 -a 将网络地址和广播地址转变成名字 -c 指定抓包的数量 -d 将匹配信息包的代码以人们能够理解的汇编格式给出 -dd 将匹配信息包的代码以c语言程序段的格式给 ...
- Django框架 之 ORM 常用字段和参数
Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...
- 远程服务器上的weblogic项目管理(三)常用指令及常见错误
weblogic的管理流程已在前两节整理完毕,接下来汇总一下linux环境下的weblogic管理常用指令及常见错误: 常用指令: ./startWebLogic.sh 启动weblogic ./st ...
随机推荐
- 浅谈ajax的优点与缺点
AJAX (Asynchronous Javascript and XML) 是一种交互式动态web应用开发技术,该技术能提供富用户体验. 完全的AJAX应用给人以桌面应用的感觉.正如其他任何技术,A ...
- mysql deadlock
http://database.51cto.com/art/201108/286325.htm 这篇文章说的很清楚,记下来. 原因分析: 当“update tab_test set state=106 ...
- 阶乘相关<同余与模算术>
题意: 题目很简明: 令S[n]=1*1!+2*2!+3*3!+4*4!+....+n*n! 求S[n]%10000007 多组测试数据 每组一个n n的范围:1<=n<=1000000 ...
- MyBatis基础用法(一)
<select id="getErrorTimes" resultType="Integer"> SELECT ErrorTimes FROM `e ...
- BLDC(无刷直流电机)应用相关
1.基于XC866的直流无刷电机简易正弦波控制 http://blog.gkong.com/hushunlin_219521.ashx 2.无刷直流电机的PWM调制方式介绍 http://blog.g ...
- RMQ问题再临
RMQ问题再临 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 终于,小Hi和小Ho踏上了回国的旅程.在飞机上,望着采购来的特产——小Hi陷入了沉思:还记得在上上周他们去 ...
- Amoeba详细介绍
Amoeba的中文意思是变型虫 Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库 ...
- 《accelerated c++》---------第六章
本章主要讲了算法部分.就是<algoruthm>里面的算法.
- EF 报【序列包含一个以上的元素】解决办法
1.检查模型是否存在重复的字段,eg: public class AggregateRoot { public System.Guid Guid { get; set; } } public part ...
- iBATIS 3 试用手记 - The FUTURE - ITeye技术网站
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...