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实现文件路径和url相互转换的方法
Jul 06 Python
Python获取linux主机ip的简单实现方法
Apr 18 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python3.6正式版新特性预览
Dec 15 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
Django中ORM表的创建和增删改查方法示例
Nov 15 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
实例详解Python装饰器与闭包
Jul 29 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 Python
python 深度学习中的4种激活函数
Sep 18 Python
用python 绘制茎叶图和复合饼图
Feb 26 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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
php上的memcache和memcached两个pecl库
2010/03/29 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
简单实现python爬虫功能
2015/12/31 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
python flask中静态文件的管理方法
2018/03/20 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
毕业生在校学习的自我评价分享
2013/10/08 职场文书
三八节主持词
2014/03/17 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
十佳少年事迹材料
2014/12/25 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js