python-3.x - 使用 Django 信号捕获更改后更改实例值
问题描述
我有一个Course
与我的模型具有多对多关系的CustomUser
模型:
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('Email Address'), unique=True)
user_name = models.CharField(_('User Name'), max_length=150, unique=True)
# and a lot of other fields and stuff
class Course(models.Model):
enrolled_users = models.ManyToManyField(CustomUser, related_name="enrolls", blank=True)
previous_enrolled_users = models.ManyToManyField(CustomUser, related_name="previous_enrolls", blank=True)
course_name = models.CharField(_("Course Name"), max_length=200)
我想要实现的是,每当用户完成一门课程(因此用户从 中删除enrolled_users
)时,我的应用程序就会将此用户存储在 中previous_enrolled_users
,这样我就可以知道之前在该课程中注册的用户。
我已经实现了m2m_changed
这样的信号监听:
def listen_m2mchange(sender, instance, model, pk_set, action, **kwargs):
if action == 'pre_remove':
# I'm trying to guess what to do
m2m_changed.connect(listen_m2mchange, sender=Course.enrolled_users.through)
这样,每当我从课程中删除用户时,Django 都会发出信号m2m_changed
并且我会捕获该信号。我知道这instance
是Course
该类的实例,那是我要删除model
的那个类的实例。CustomUser
我无法猜测的是,如何使用Course
类的实例将其添加CustomUser
到previous_enrolled_users 中。任何帮助将不胜感激。
编辑 01:
阅读了很多文档,我知道我想要做的是每次model
都从以下内容中删除enrolled_users
:
instance.previous_enrolled_users.add(model)
但是当我这样做时,我得到一个错误:
TypeError: Field 'id' expected a number but got <class 'core.models.CustomUser'>.
解决方案
试试这个:
def listen_enrolled_users_m2mchange(sender, instance, model, pk_set, action, **kwargs):
if action == 'post_remove':
instance.previous_enrolled_users.add(*pk_set)
m2m_changed.connect(listen_enrolled_users_m2mchange, sender=Course.enrolled_users.through)
pk_set
这里将是一组主键,这些主键参与enrolled_users
了Course
. 这意味着当 action 为 时post_remove
,所有删除的CustomUser
主键都将在pk_set
kwarg 中传递。
这意味着当信号开始改变enrolled_users
of 时Course
,我们可以检查该操作是否为移除。在这种情况下,pk_set
我们收到的被删除的相同内容enrolled_users
可以直接添加到 previous_enrolled_users
.
推荐阅读
- xamarin.forms - 在 Xamarin.Forms 中创建 UI 元素
- debian - Artifactory Jfrog 中的 Debian Bionic 错误
- python - Django:forms.ChoiceField 在新页面加载后不刷新
- php - 匹配过滤器必须是 PHP 中具有 mongo 聚合的对象中的表达式
- python - 在 for 循环中连接 numpy 数组
- prestashop-1.7 - Prestashop 1.7 在产品列表中显示横幅
- node.js - 我可以安装 node_modules 一次,并且需要所有时间吗
- python - 使用 pandas 抓取 HTML:它可以用来抓取网页中的表格吗?
- laravel - 如何将用户帐户验证码保存到 Laravel 中的文本文件?
- docker - 如何使用卷在 dockerized DynamoDB 中持久化数据