django使用F方法更新一个对象多个对象字段的实现


Posted in Python onMarch 28, 2020

通常情况下我们在更新数据时需要先从数据库里将原数据取出后放在内存里,然后编辑某些字段或属性,最后提交更新数据库。使用F方法则可以帮助我们避免将所有数据先载入内存,而是直接生成SQL语句更新数据库。

假如我们需要对所有产品的价格涨20%,我们通常做法如下。当产品很少的时候,对网站性能没影响。但如果产品数量非常多,把它们信息全部先载入内存会造成很大性能浪费。

products = Product.objects.all()
for product in products:
  product.price *= 1.2
  product.save()

使用F方法可以解决上述问题。我们直接可以更新数据库,而不必将所有产品载入内存。

from django.db.models import F

Product.objects.update(price=F('price') * 1.2)

我们也可以使用F方法更新单个对象的字段,如下所示:

product = Product.objects.get(pk=5009)
product.price = F('price') * 1.2
product.save()

但值得注意的是当你使用F方法对某个对象字段进行更新后,需要使用refresh_from_db()方法后才能获取最新的字段信息(非常重要!)。

如下所示:

product.price = F('price') + 1
product.save()
print(product.price)      # <CombinedExpression: F(price) + Value(1)>
product.refresh_from_db()
print(product.price)      # Decimal('13.00')

补充知识:Django批量更新多个属性

有时候我们需要同时(一次性)更新某个用户的多条属性。

1. 用户model如下:

class User(models.Model):
  UID = models.CharField('员工uid', max_length=200,)
  name = models.CharField('员工名字', max_length=200,)
  mobile = models.CharField('手机号', max_length=200,)
  mail = models.EmailField(u'邮箱', max_length=200)

2. 用户的数据

user_info = {'UID': 'ADBES682BOEO',
      'name': '张三',
      'mobile': '12345678911',
      'mail': 'test@test.com'
      }

3. 新建用户

User.object.create(UID='ADBES682BOEO',name='张三',mobile='12345678911',mail='test@test.com')

这就会在数据库中新建一个张三的数据。

4. 更新数据

user_info = {'UID': 'ADBES682BOEO',
      'name': '张三2',
      'mobile': '12345678912',
      'mail': 'test2@test.com'
      }

4.1 一般的更新操作

user = User.object.get(UID='ADBES682BOEO')
user.name = user_info['name']
user.mobile = user_info['mobile']
user.mail = user_info['mail']
user.save()

4.2 批量操作

user = User.object.filter(UID='ADBES682BOEO')
user.update(**user_info)

以上这篇django使用F方法更新一个对象多个对象字段的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用新浪微博API发送微博的例子
Apr 10 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
使用DataFrame删除行和列的实例讲解
Apr 08 Python
解决Python中定时任务线程无法自动退出的问题
Feb 18 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python openpyxl使用方法详解
Jul 18 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
Python递归函数特点及原理解析
Mar 04 Python
django下创建多个app并设置urls方法
Aug 02 Python
这样写python注释让代码更加的优雅
Jun 02 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
Mar 28 #Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 #Python
使用python客户端访问impala的操作方式
Mar 28 #Python
python 安装impala包步骤
Mar 28 #Python
django 链接多个数据库 并使用原生sql实现
Mar 28 #Python
Django多数据库配置及逆向生成model教程
Mar 28 #Python
后端开发使用pycharm的技巧(推荐)
Mar 27 #Python
You might like
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
JavaScript数组的5种迭代方法
2017/09/29 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
python实现识别相似图片小结
2016/02/22 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
生产副总岗位职责
2013/11/28 职场文书
夜班门卫岗位职责
2013/12/09 职场文书
技能竞赛活动方案
2014/02/21 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
生产车间标语
2014/06/11 职场文书
小学捐书活动总结
2014/07/05 职场文书
党员目标管理责任书
2014/07/25 职场文书
好的旅游活动方案
2014/08/19 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书