原文出处: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