Django查询对比其他字段

  • 发布时间:2017年9月27日 11:12
  • 作者:杨仕航
  • 分类标签: Django
  • 阅读(10000)
  • 评论(2)

一直以来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官方文档

上一篇:MySQL在Linux自动定时备份功能

下一篇:Apache反向代理处理js跨域问题

相关专题: Django QuerySet查询   

评论列表

杨学光

杨学光

很久不见你更新博客了呀!最近在搞什么大动作?

2017-11-09 16:54 回复

杨学光

杨学光

录的怎么样了?是基础教程还是实战项目教程?

2017-11-14 11:41 回复

新的评论

清空