我想跟踪任何模型上的哪些字段发生了变化(即在模型级别进行审计,因为它更原子,而不是像 django 和 django-reversion 已经可以做的那样在管理/表单级别)。我可以使用 pre/post save/delete 信号对任何字段执行此操作。但是,我在 m2m 字段上执行此操作时遇到问题。
对于下面的代码示例,我在用户更改表单中定义了“custom_groups”m2m 字段,因为它是反向关系。例如,当用户在管理界面上保存表单时,如果“custom_groups”字段发生变化,我想记录。
模型:
from django.contrib.auth.models import User
class CustomGroup(models.Model):
users = models.ManyToManyField(User, related_name='custom_groups')
模型形式:
class CustomUserChangeForm(UserChangeForm):
custom_groups = forms.ModelMultipleChoiceField(required=False, queryset=CustomGroup.objects.all())
使用 m2m_changed 信号的问题是,对于使用赋值运算符更新 m2m 字段的情况,我无法检查实际发生了什么变化:
user.custom_groups = self.cleaned_data['custom_groups']
这是因为在手动添加所有对象之前,django 内部会在 *custom_groups* 上执行 clear()。这将执行前/后清除,然后在 m2m 字段上执行前/后保存。
我做这一切都是错误的吗?有没有更简单的方法可以实际工作?
谢谢!