5

我想跟踪任何模型上的哪些字段发生了变化(即在模型级别进行审计,因为它更原子,而不是像 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 字段上执行前/后保存。

我做这一切都是错误的吗?有没有更简单的方法可以实际工作?

谢谢!

4

1 回答 1

12

我有一个类似的问题,我想我可以解决它。我不知道您是如何使用 m2m_changed 的​​,但它应该在 models.py 上,并且应该类似于以下内容:

signals.m2m_changed.connect(your_function, sender=CustomGroup.users.through)

现在,我将创建一个包含该函数的 signals.py 文件,下面的代码将打印您选择的选项:

def your_function(sender, instance, action, reverse, model, pk_set, **kwargs):
    if action == 'post_add':
        for val in pk_set:
            print val

现在,您知道更新后的值了。我希望这可以解决您的问题。

于 2011-03-29T07:19:06.530 回答