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中操作字典之clear()方法的使用
May 21 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
浅谈python中的__init__、__new__和__call__方法
Jul 18 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
用Python进行简单图像识别(验证码)
Jan 19 Python
python实现Flappy Bird源码
Dec 24 Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 Python
Python openpyxl模块原理及用法解析
Jan 19 Python
django实现模板中的字符串文字和自动转义
Mar 31 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
python中_del_还原数据的方法
Dec 09 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
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
javascript函数库-集合框架
2007/04/27 Javascript
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python中遍历文件的3个方法
2014/09/02 Python
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
Python argv用法详解
2016/01/08 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
聘任书的写作格式及范文
2014/03/29 职场文书
公司活动总结怎么写
2014/06/25 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
财务会计岗位职责
2015/02/03 职场文书
三国演义读书笔记
2015/06/25 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫