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编程中的包结构
Oct 25 Python
Python中random模块生成随机数详解
Mar 10 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
Random 在 Python 中的使用方法
Aug 09 Python
提升Python程序性能的7个习惯
Apr 14 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
Python操作redis和mongoDB的方法
Dec 19 Python
pyspark给dataframe增加新的一列的实现示例
Apr 24 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
python实战之用emoji表情生成文字
May 08 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合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
PHP中大于2038年时间戳的问题处理方案
2015/03/03 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
javascript生成大小写字母
2015/07/03 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
python搭建简易服务器分析与实现
2012/12/15 Python
python实现根据图标提取分类应用程序实例
2014/09/28 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
高效使用Python字典的清单
2018/04/04 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
亲戚结婚的请假条
2014/02/11 职场文书
集体婚礼策划方案
2014/02/22 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
微信小程序调用python模型
2022/04/21 Python
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL