Django中的F和Q函数

内容简介:html

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

1、F介绍

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

一般状况下咱们在更新数据时须要先从数据库里将原数据取出后方在内存里,而后编辑某些属性,最后提交。例如:数据库

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

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

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

可是咱们本意想生成的sql语句为:django

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操做。ui

上述代码中无论 order.amount 的值是什么,Python都未曾获取过其值,python作的惟一的事情就是经过Django的F()函数建立了一条SQL语句而后执行而已。spa

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

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

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

order.refresh_from_db()
 

 

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

参考:

相关文章
相关标签/搜索