【转载】Django中的F和Q函数

发布于 2019-06-27  398 次阅读


Django中的F和Q函数
内容简介:
介绍Django中的F和Q作用以及使用方法

一、F介绍

作用:操作数据表中的某列值,F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段进行操作,直接执行原生产sql语句操作。
通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。例如:

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

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

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

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

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

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

from django.db.models import F
from core.models import Order

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

当Django程序中出现F()时,Django会使用SQL语句的方式取代标准的Python操作。
上述代码中不管 order.amount 的值是什么,Python都不曾获取过其值,python做的唯一的事情就是通过Django的F()函数创建了一条SQL语句然后执行而已。
需要注意的是在使用上述方法更新过数据之后需要重新加载数据来使数据库中的值与程序中的值对应:
order= Order.objects.get(pk=order.pk)
或者使用更加简单的方法:
order.refresh_from_db()

参考博客:http://www.tuicool.com/articles/u6FBRz
官方地址:http://docs.djangoproject.com/en/1.11/ref/models/expressions/

二、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')

参考:
博客:http://www.cnblogs.com/linjiqin/p/3817814.html
官网地址:http://docs.djangoproject.com/en/1.11/topics/db/queries/#complex-lookups-with-q

源文档地址:http://www.cnblogs.com/wdliu/p/7977504.html