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新手们容易犯的几个错误总结
Apr 01 Python
python实现协同过滤推荐算法完整代码示例
Dec 15 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
Python理解递归的方法总结
Jan 28 Python
深入了解Python iter() 方法的用法
Jul 11 Python
详解python实现数据归一化处理的方式:(0,1)标准化
Jul 17 Python
python3实现高效的端口扫描
Aug 31 Python
python线性插值解析
Jul 05 Python
django美化后台django-suit的安装配置操作
Jul 12 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
php中定时计划任务的实现原理
2013/01/08 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php输出xml属性的方法
2015/03/19 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
Python模拟百度登录实例详解
2016/01/20 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
python实现求最长回文子串长度
2018/01/22 Python
Python之reload流程实例代码解析
2018/01/29 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
甲方资料员岗位职责
2013/12/13 职场文书
环境工程专业自荐信
2014/03/03 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
导游词400字
2015/02/13 职场文书
导游词之山海关
2019/12/10 职场文书