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实现日常记账本小程序
Mar 10 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
树莓派3 搭建 django 服务器的实例
Aug 29 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
tensorflow安装成功import tensorflow 出现问题
Apr 16 Python
python实现飞船游戏的纵向移动
Apr 24 Python
Python unittest单元测试框架实现参数化
Apr 29 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 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
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
小程序转发探索示例
2019/02/19 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
如何真正的了解python装饰器
2020/08/14 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
Python中如何定义一个函数
2016/09/06 面试题
Java servlet面试题
2012/03/04 面试题
《童年的发现》教学反思
2014/02/14 职场文书
人事专员的职责
2014/02/26 职场文书
借款担保书范文
2014/05/13 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
故宫英文导游词
2015/01/31 职场文书
总经理助理岗位职责
2015/01/31 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书