关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
一直以来django查询用得比较多的条件比较都是和一个常量比较。例如:
blogs = Blog.objects.filter(pk=1)
有时需要在同一个模型中字段和字段之间比较,假如Blog有两个字段creation_time和last_updated_time,创建时间和最后修改时间。找出最后修改时间大于创建时间的filter如下:
import django.db.models import F blogs = Blog.objects.filter(last_updated_time__gt=F("creation_time"))
其中,比较大于的表达式是使用__gt修饰。
其次,字段和字段比较使用F()对象。
另外,F()对象也可以使用加减乘除等运算。假如Blog有评论数和阅读数字段:comment_num、view_num。阅读数是评论数两倍或两倍以上的filter如下:
import django.db.models import F blogs = Blog.objects.filter(view_num__gt=F("comment_num") * 2)
F()对象还可以使用双下划线找到有关系模型的相关字段。具体可以看Django官方文档。
再拓展F()很有用的用法:批量更新数据。
例如我想给阅读数小于10的blog,阅读计数字段都加10。普通方法如下:
blogs = Blog.objects.filter(view_num_lt=10) for blog in blogs: blog.view_num = blog.view_num + 10 blog.save()
看上去没问题。实际上会有线程不安全的问题和执行效率一般。如果我在做这个处理的同时,有人刚好访问其中某一篇阅读数小于10的blog。这次阅读可能不会被记录。我们可以使用update方法和F()对象批量更新数据:
blogs = Blog.objects.filter(view_num_lt=10) blogs.update(view_num=F("view_num") + 10)
上面代码意思是把view_num字段的数据加10更新给view_num字段。该方法安全且不用把数据加载进来再修改,执行效率比较高。详细可以看Django官方文档。
相关专题: Django QuerySet查询
杨学光
很久不见你更新博客了呀!最近在搞什么大动作?
2017-11-09 16:54 回复
杨学光
录的怎么样了?是基础教程还是实战项目教程?
2017-11-14 11:41 回复