加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Django中的F和Q函数

发布时间:2020-12-15 17:17:15 所属栏目:大数据 来源:网络整理
导读:内容简介: 介绍Django中的F和Q作用以及使用方法 ?作用:操作数据表中的某列值,F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段进行操作,直接执行原生产sql语句操作。 通常情况下我们在更新数据时需要

内容简介:

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

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

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

obj = Order.objects.get(orderid=+= 1

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

UPDATE `core_order` SET ...,`amount` = 22 WHERE `core_order`.`orderid` =

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

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

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

django.db.models core.models obj = Order.objects.get(orderid=<span style="color: #800000;">'<span style="color: #800000;">12<span style="color: #800000;">'<span style="color: #000000;">)
obj.amount
= F(<span style="color: #800000;">'
<span style="color: #800000;">amount<span style="color: #800000;">') + 1<span style="color: #000000;">
obj.save()
<span style="color: #008000;">#<span style="color: #008000;">生成的sql语句为:
UPDATE core_order SET ...,amount = core_order.amount + 1 WHERE core_order.orderid = <span style="color: #800000;">'<span style="color: #800000;">12<span style="color: #800000;">' <span style="color: #008000;">#<span style="color: #008000;"> 和预计的一样

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

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

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

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

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

order.refresh_from_db()

?
参考博客:
官方地址:

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">二、Q介绍</td>

</tr>

</table>

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

基本使用:

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

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

=date(2005,5,2)) | Q(pub_date=date(2005,6=)

参考:

博客:
官网地址:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!