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中二维阵列的变换实例
Oct 09 Python
go语言计算两个时间的时间差方法
Mar 13 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
Python Property属性的2种用法
Jun 21 Python
在Python 3中实现类型检查器的简单方法
Jul 03 Python
python利用拉链法实现字典方法示例
Mar 25 Python
python获取url的返回信息方法
Dec 17 Python
用Python逐行分析文件方法
Jan 28 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
vue常用指令代码实例总结
Mar 16 Python
python+opencv实现车道线检测
Feb 19 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
js function定义函数使用心得
2010/04/15 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
Python命令行click参数用法解析
2019/12/19 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
专科毕业生学习生活的自我评价
2013/10/26 职场文书
优秀中专生推荐信
2013/11/17 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
以权谋私检举信范文
2015/03/02 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL