Django model update的多种用法介绍


Posted in Python onMarch 28, 2020

model update常规用法

假如我们的表结构是这样的

class User(models.Model):
 username = models.CharField(max_length=255, unique=True, verbose_name='用户名')
 is_active = models.BooleanField(default=False, verbose_name='激活状态')

那么我们修改用户名和状态可以使用如下两种方法:

方法一:

User.objects.filter(id=1).update(username='nick',is_active=True)

方法二:

_t = User.objects.get(id=1)
_t.username='nick'
_t.is_active=True
_t.save()

方法一适合更新一批数据,类似于mysql语句update user set username='nick' where id = 1

方法二适合更新一条数据,也只能更新一条数据,当只有一条数据更新时推荐使用此方法,另外此方法还有一个好处,我们接着往下看

具有auto_now属性字段的更新

我们通常会给表添加三个默认字段

  • 自增ID,这个django已经默认加了,就像上边的建表语句,虽然只写了username和is_active两个字段,但表建好后也会有一个默认的自增id字段

  • 创建时间,用来标识这条记录的创建时间,具有auto_now_add属性,创建记录时会自动填充当前时间到此字段

  • 修改时间,用来标识这条记录最后一次的修改时间,具有auto_now属性,当记录发生变化时填充当前时间到此字段

就像下边这样的表结构

class User(models.Model):
 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
 update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
 username = models.CharField(max_length=255, unique=True, verbose_name='用户名')
 is_active = models.BooleanField(default=False, verbose_name='激活状态')

当表有字段具有auto_now属性且你希望他能自动更新时,必须使用上边方法二的更新,不然auto_now字段不会更新,也就是:

_t = User.objects.get(id=1)
_t.username='nick'
_t.is_active=True
_t.save()

json/dict类型数据更新字段

目前主流的web开放方式都讲究前后端分离,分离之后前后端交互的数据格式大都用通用的jason型,那么如何用最少的代码方便的更新json格式数据到数据库呢?同样可以使用如下两种方法:

方法一:

data = {'username':'nick','is_active':'0'}
User.objects.filter(id=1).update(**data)
  • 同样这种方法不能自动更新具有auto_now属性字段的值
  • 通常我们再变量前加一个星号(*)表示这个变量是元组/列表,加两个星号表示这个参数是字典

方法二:

data = {'username':'nick','is_active':'0'}
_t = User.objects.get(id=1)
_t.__dict__.update(**data)
_t.save()

方法二和方法一同样无法自动更新auto_now字段的值

注意这里使用到了一个dict方法

方法三:

_t = User.objects.get(id=1)
_t.role=Role.objects.get(id=3)
_t.save()

ForeignKey字段更新

假如我们的表中有Foreignkey外键时,该如何更新呢?

class User(models.Model):
 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
 update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
 username = models.CharField(max_length=255, unique=True, verbose_name='用户名')
 is_active = models.BooleanField(default=False, verbose_name='激活状态')
 role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, verbose_name='角色')

方法一:

User.objects.filter(id=1).update(role=2)
  • 最简单的方法,直接让给role字段设置为一个id即可
  • 当然也可以用dict作为参数更新:
User.objects.filter(id=1).update(**{'username':'nick','role':3})

方法二:

_role = Role.objects.get(id=2)
User.objects.filter(id=1).update(role=_role)
  • 也可以赋值一个实例给role
  • 当然也可以用dict作为参数更新:
_role = Role.objects.get(id=1)
User.objects.filter(id=1).update(**{'username':'nick','role':_role})

方法三:

_t = User.objects.get(id=1)
_t.role=Role.objects.get(id=3)
_t.save()
  • 注意:这里的role必须赋值为一个对象,不能写id,不然会报错"User.role" must be a "Role" instance
  • 当使用dict作为参数更新时又有一点不同,如下代码:
_t = User.objects.get(id=1)
_t.__dict__.update(**{'username':'nick','role_id':2})
_t.save()
  • Foreignkey外键必须加上`_id`,例如:{'role_id':3}
  • role_id后边必须跟一个id(int或str类型都可),不能跟role实例

ManyToManyField字段更新

假如我们的表中有ManyToManyField字段时更新又有什么影响呢?

class User(models.Model):
 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
 update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
 username = models.CharField(max_length=255, unique=True, verbose_name='用户名')
 is_active = models.BooleanField(default=False, verbose_name='激活状态')
 role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, verbose_name='角色')
 groups = models.ManyToManyField(Group, null=True, verbose_name='组')

m2m更新:m2m字段没有直接更新的方法,只能通过清空再添加的方法更新了

_t = User.objects.get(id=1)
_t.groups.clear()
_t.groups.add(*[1,3,5])
_t.save()

add():m2m字段添加一个值,当有多个值的时候可用列表,参照上边例子

_t.groups.add(2)
_t.groups.add(Group.objects.get(id=2))

remove():m2m字段移除一个值,,当有多个值的时候可用列表,参照上边例子

_t.groups.remove(2)
_t.groups.remove(Group.objects.get(id=2))

clear():清空m2m字段的值

以上这篇Django model update的多种用法介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
让Python代码更快运行的5种方法
Jun 21 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
详解python中的 is 操作符
Dec 26 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
python、PyTorch图像读取与numpy转换实例
Jan 13 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
Feb 18 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
Python hashlib模块的使用示例
Oct 09 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 Python
常用的Python代码调试工具总结
Jun 23 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 Python
Django model select的多种用法详解
Jul 16 #Python
python删除文件夹下相同文件和无法打开的图片
Jul 16 #Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 #Python
python实现字符串完美拆分split()的方法
Jul 16 #Python
python如何删除文件中重复的字段
Jul 16 #Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 #Python
Python使用正则表达式分割字符串的实现方法
Jul 16 #Python
You might like
使用图灵api创建微信聊天机器人
2015/07/23 PHP
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
js实现简易计算器功能
2019/10/18 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
2021/01/29 jQuery
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
Linux如何压缩可执行文件
2013/10/21 面试题
ktv总经理岗位职责
2014/02/17 职场文书
公司合并协议书范本
2014/09/30 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
JVM之方法返回地址详解
2022/02/28 Java/Android
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js