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实现将元祖转换成数组的方法
May 04 Python
在Python中处理字符串之isdigit()方法的使用
May 18 Python
深入解析Python中的集合类型操作符
Aug 19 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
Python绘制3D图形
May 03 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
python支付宝支付示例详解
Aug 22 Python
python两种注释用法的示例
Oct 09 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 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下一个非常全面获取图象信息的函数
2008/11/20 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
php生成word并下载代码实例
2019/03/15 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
深入研究React中setState源码
2017/11/17 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
Python匹配中文的正则表达式
2016/05/11 Python
Django实现组合搜索的方法示例
2018/01/23 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
python3实现逐字输出的方法
2019/01/23 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python程序 创建多线程过程详解
2019/09/23 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
社团2014年植树节活动总结
2014/03/11 职场文书
设计师求职信
2014/07/01 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
环卫工作汇报材料
2014/10/28 职场文书
邀请函格式范文
2015/02/02 职场文书
实习护士自荐信
2015/03/25 职场文书
反腐倡廉观后感
2015/06/08 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript