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 切片和range()用法说明
Mar 24 Python
python遍历类中所有成员的方法
Mar 18 Python
scrapy爬虫完整实例
Jan 25 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python如何创建TCP服务端和客户端
Aug 26 Python
python实现翻转棋游戏(othello)
Jul 29 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
python opencv 实现对图像边缘扩充
Jan 19 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
Mar 02 Python
python3中TQDM库安装及使用详解
Nov 18 Python
Python如何批量生成和调用变量
Nov 21 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 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使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python实例之wxpython中Frame使用方法
2014/06/09 Python
一张图带我们入门Python基础教程
2017/02/05 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
Python线性回归实战分析
2018/02/01 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python的等深分箱实例
2019/11/22 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
新护士岗前培训制度
2014/02/02 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
绩效考核实施方案
2014/03/18 职场文书
初中英语演讲稿
2014/04/29 职场文书
大学生应聘求职信
2014/05/26 职场文书
团拜会策划方案
2014/06/07 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
会计岗位工作总结
2015/08/12 职场文书