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的keyword模块用法实例分析
Jun 30 Python
python检查字符串是否是正确ISBN的方法
Jul 11 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
python原类、类的创建过程与方法详解
Jul 19 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
基于python-pptx库中文文档及使用详解
Feb 14 Python
python实现密码强度校验
Mar 18 Python
Python 如何批量更新已安装的库
May 26 Python
python数据类型强制转换实例详解
Jun 22 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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微信高级接口群发 多客服
2016/06/23 PHP
php使用PDO获取结果集的方法
2017/02/16 PHP
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
php 修改密码实现代码
2017/05/24 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
JS数组求和的常用方法实例小结
2019/01/07 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
Python字符串切片操作知识详解
2016/03/28 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
Nike瑞士官网:Nike CH
2021/01/18 全球购物
小学生新学期寄语
2014/01/19 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
五一活动标语
2014/06/30 职场文书
委托书范本
2014/09/13 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
2014年教务处工作总结
2014/12/03 职场文书
2015年派出所工作总结
2015/04/24 职场文书
蜗居观后感
2015/06/11 职场文书
《观潮》教学反思
2016/02/17 职场文书
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA