Django Model更新不触发Signals的原因及解决办法
  0IqwMzsiLBJo 2023年11月08日 68 0

原文出处:https://xie.infoq.cn/article/3848c5f2e30afa7d0d2278bd6#:~:text=%E5%8E%9F%E5%9B%A0%20%E5%9B%A0%E4%B8%BA%E8%BF%99%E7%A7%8D%E5%BD%A2%E5%BC%8F%EF%BC%9AUser.objects.filter,%28id%3D1%29.update%20%28%2A%2Auser_attr%29%EF%BC%8CDjango%E7%9B%B4%E6%8E%A5%E6%9B%B4%E6%96%B0%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%8C%E6%B2%A1%E6%9C%89%E7%BB%8F%E8%BF%87%20models%EF%BC%8C%E6%89%80%E4%BB%A5%E4%B8%8D%E4%BC%9A%E8%A7%A6%E5%8F%91Signals%E6%9C%BA%E5%88%B6%E3%80%82

当指定的 models 变化时,能够触发 django 的 Signals 机制。这样我们就可以针对 models 变化做对应的操作。

简单的使用文档:https://www.cnblogs.com/fiona-zhong/p/9983996.html

原来的代码

models.py

class User(models.Model): username = models.CharField(max_length=255, unique=True, verbose_name='用户名') mobile = models.CharField(max_length=255, verbose_name='手机号') is_active = models.BooleanField(default=False, verbose_name='激活状态')

views.py

user_attr = { mobile="1234567890", is_active=True } User.objects.filter(id=1).update(**user_attr) 然后我通过 Signals 机制,监控字段is_active是否改为True,然后触发一些动作

@receiver(signals.post_save, sender=User) def migrate_user_modify(instance, created, **kwargs): # created:新建数据时是True,更新是False if not created and instance.is_active == True: do someting 遇到的问题 本以为views.py中的代码执行后,会触发Signals机制,然后do something,但是实际没有任何动作。

解决办法 修改views.py中的数据更新方法。改为:

方式一:

_t = User.objects.get(id=1) _t.mobile='1234567890' _t.is_active=True _t.save() 方式二:

user_attr = { mobile="1234567890", is_active=True } _t = User.objects.get(id=1) _t.dict.update(**user_attr) _t.save()

原因 因为这种形式:User.objects.filter(id=1).update(**user_attr),Django 直接更新的数据库,没有经过models,所以不会触发Signals机制。

官方文档有解释:https://docs.djangoproject.com/zh-hans/2.2/topics/db/queries/ ,搜索"要认识到 update() 方法是直接转为 SQL 语句的",后边明确写有。

知道了原因,我们就针对修改为上边的两种更新方式就可以了。

参考文档: 官方文档:https://docs.djangoproject.com/zh-hans/2.2/topics/db/queries/

Django model update 的各种用法介绍:https://juejin.im/post/5b588b656fb9a04fba6e8681

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
0IqwMzsiLBJo