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实现求数列和的方法示例
Jan 12 Python
python如何读写csv数据
Mar 21 Python
python实现批量解析邮件并下载附件
Jun 19 Python
使用Python对微信好友进行数据分析
Jun 27 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
linux中如何使用python3获取ip地址
Jul 15 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 Python
python使用numpy中的size()函数实例用法详解
Jan 29 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利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
linux下php上传文件注意事项
2016/06/11 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
[52:03]Secret vs VG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
跟老齐学Python之永远强大的函数
2014/09/14 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Android分包MultiDex策略详解
2017/10/30 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
2020/09/17 Python
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
高中生班主任评语
2014/04/25 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
教师节横幅标语
2014/10/08 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python