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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
Python函数参数类型*、**的区别
Apr 11 Python
python查询sqlite数据表的方法
May 08 Python
python相似模块用例
Mar 04 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
Aug 28 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
Python面向对象之类和对象实例详解
Dec 10 Python
Python实现合并两个有序链表的方法示例
Jan 31 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
Jun 08 Python
Python reques接口测试框架实现代码
Jul 28 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中json_decode()和json_encode()的使用方法
2012/06/04 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
PHP里的单例类写法实例
2015/06/25 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
理解javascript封装
2016/02/23 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
python和C语言混合编程实例
2014/06/04 Python
python爬取哈尔滨天气信息
2018/07/14 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
房地产项目策划书
2014/02/05 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
教师师德考核自我评价
2014/09/13 职场文书
大学生就业意向书
2015/05/11 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android