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 相关文章推荐
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
Python正则表达式常用函数总结
Jun 24 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
python微信公众号开发简单流程
Mar 23 Python
TensorFlow实现Logistic回归
Sep 07 Python
python训练数据时打乱训练数据与标签的两种方法小结
Nov 08 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
Python实现LR1文法的完整实例代码
Oct 25 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
php获取当前时间的毫秒数的方法
2014/01/26 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
javascript Excel操作知识点
2009/04/24 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
js有序数组的连接问题
2013/10/01 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
python中对_init_的理解及实例解析
2019/10/11 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
python源文件的字符编码知识点详解
2021/03/04 Python
IRO美国官网:法国服装品牌
2018/03/06 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
优秀应届毕业生自荐书
2014/06/29 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
法制教育主题班会
2015/08/13 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python