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读写excel的方法
Nov 18 Python
Python编程入门的一些基本知识
May 13 Python
python操作mongodb根据_id查询数据的实现方法
May 20 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
Python使用剪切板的方法
Jun 06 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 Python
python画环形图的方法
Mar 25 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
Python实现初始化不同的变量类型为空值
Jun 02 Python
浅谈Python 中的复数问题
May 19 Python
python not运算符的实例用法
Jun 30 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
最常用的8款PHP调试工具
2014/07/06 PHP
ThinkPHP模型详解
2015/07/27 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
js 匿名调用实现代码
2009/06/19 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
Python下Fabric的简单部署方法
2015/07/14 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
Python基于execjs运行js过程解析
2020/11/27 Python
《桂花雨》教学反思
2014/04/12 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
云冈石窟导游词
2015/02/04 职场文书
在校生证明
2015/06/17 职场文书
如何撰写创业策划书
2019/06/27 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技