内容简介:

介绍Django中的F和Q作用以及使用方法

一、F介绍

作用:操作数据表中的某列值,F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段进行操作,直接执行原生产sql语句操作。

通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。例如:

obj = Order.objects.get(orderid='')
obj.amount += 1
obj.order.save()

上述方法生成的sql语句为:

UPDATE `core_order` SET ..., `amount` = 22 WHERE `core_order`.`orderid` = '' # ...表示Order中的其他值,在这里会重新赋一遍值; 22表示为计算后的结果

但是我们本意想生成的sql语句为:

UPDATE `core_order` SET ..., `amount` = `amount` + 1 WHERE `core_order`.`orderid` = ''

此时F的使用场景就在于此:

from django.db.models import F
from core.models import Order obj = Order.objects.get(orderid='')
obj.amount = F('amount') + 1
obj.save()
#生成的sql语句为:
UPDATE `core_order` SET ..., `amount` = `core_order`.`amount` + 1 WHERE `core_order`.`orderid` = '' # 和预计的一样

当Django程序中出现F()时,Django会使用SQL语句的方式取代标准的Python操作。

上述代码中不管 order.amount 的值是什么,Python都不曾获取过其值,python做的唯一的事情就是通过Django的F()函数创建了一条SQL语句然后执行而已。

需要注意的是在使用上述方法更新过数据之后需要重新加载数据来使数据库中的值与程序中的值对应

order= Order.objects.get(pk=order.pk)

或者使用更加简单的方法:

order.refresh_from_db()

 
二、Q介绍

作用:对对象进行复杂查询,并支持&(and),|(or),~(not)操作符。

基本使用:

from django.db.models import Q
search_obj=Asset.objects.filter(Q(hostname__icontains=keyword)|Q(ip=keyword))

如果查询使用中带有关键字查询,Q对象一定要放在前面

Asset.objects.get(
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith='Who')

参考:

最新文章

  1. Spring事务属性的介绍
  2. 笔记 进程(processes)
  3. nginx反向代理实现跨域请求
  4. java5 ReadWriteLock用法--读写锁实现
  5. $where $options: 'g','i'
  6. [LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针
  7. CentOS(三)--初识linux的文件系统以及用户组等概念
  8. java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
  9. MapReduce扩展:应用程序如何运行于Hadoop Yarn之上
  10. ios 导航页面
  11. Vue.js-10:第十章 - 组件间的数据通信
  12. 性能测试学习 第九课--LR12中controller基础知识
  13. AX_ClassTemplate
  14. 剑指offer(38)二叉树的深度
  15. 摘录和再编:彻底弄懂JS执行机制
  16. Java笔试面试题整理第三波
  17. LNMP 1.x升级到LNMP 1.4教程及注意事项和多PHP版本使用教程
  18. 2017-2018-2 20155224『网络对抗技术』Exp4:恶意代码分析
  19. PHP从入门到精通
  20. WIN10系统如何关闭用户账户控制

热门文章

  1. SQL Server CPU
  2. JS中将一个值转换为字符串的3种方法
  3. mysql目录迁移 更改mysql的存储目录
  4. C#wxpay和alipay
  5. mysql自连接求累计金额
  6. hadoop fs命令
  7. php的二维数组排序
  8. 【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)
  9. [转载]binlog归档
  10. 记录:使用rpm安装JDK