内容简介:Django开发过程中对表(model)的增删改查是最常用的功能之一,本文介绍笔者在使用model update过程中遇到的那些事[ 运行环境:Django2.0 ]假如我们的表结构是这样的
Django开发过程中对表(model)的增删改查是最常用的功能之一,本文介绍笔者在使用model update过程中遇到的那些事
[ 运行环境:Django2.0 ]
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属性字段的更新
我们通常会给表添加三个默认字段
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的各种用法介绍》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- KotterKnife 库中 Kotlin 高级用法介绍
- C++ STL容器——stack用法介绍
- golang 的 strings 包的 Trim 的用法介绍
- AWK 的用法
- AWK基础用法
- UniversalImageLoader的用法总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Out of their Minds
Dennis Shasha、Cathy Lazere / Springer / 1998-07-02 / USD 16.00
This best-selling book is now available in an inexpensive softcover format. Imagine living during the Renaissance and being able to interview that eras greatest scientists about their inspirations, di......一起来看看 《Out of their Minds》 这本书的介绍吧!