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