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中的CURL PycURL使用例子
Jun 01 Python
Python中的下划线详解
Jun 24 Python
深入浅析Python字符编码
Nov 12 Python
Python中easy_install 和 pip 的安装及使用
Jun 05 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
python opencv读mp4视频的实例
Dec 07 Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
简单了解Django应用app及分布式路由
Jul 24 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
python__new__内置静态方法使用解析
Jan 07 Python
详解python with 上下文管理器
Sep 02 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
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
php实现mysql封装类示例
2014/05/07 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
python获取图片颜色信息的方法
2015/03/18 Python
深入Python函数编程的一些特性
2015/04/13 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
python实现简易动态时钟
2018/11/19 Python
Python list与NumPy array 区分详解
2019/11/06 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
Python Map 函数的使用
2020/08/28 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
为你的html5网页添加音效示例
2014/04/03 HTML / CSS
外企C语言笔试题
2013/11/10 面试题
护理专业毕业生自荐信范文
2014/01/05 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
十八大感想感言
2014/02/10 职场文书
美术毕业生求职信
2014/02/25 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
2015年法制宣传月活动总结
2015/03/26 职场文书
我的生日感言
2015/08/03 职场文书