Django:使用m2m_changed信号无法检测多对多字段的变化 - 在模型级别审计

Django:使用m2m_changed信号无法检测多对多字段的变化 - 在模型级别审计

问题描述:

我想跟踪任何模型的字段已更改(即在模型级别进行审计,因为它更原子化,不像管理员/表单层级,就像django和django-reversion已经可以做到的那样)。我能够使用前/后保存/删除信号为任何字段做到这一点。但是,我在m2m字段中遇到了这样的问题。Django:使用m2m_changed信号无法检测多对多字段的变化 - 在模型级别审计

对于下面的代码示例,我定义了用户更改表单中的'custom_groups'm2m字段,因为它是反向关系。例如,当用户在管理界面上保存表单时,我想记录'custom_groups'字段中是否有更改。

型号:

from django.contrib.auth.models import User 

class CustomGroup(models.Model): 
    users = models.ManyToManyField(User, related_name='custom_groups') 

的ModelForm:

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字段中的前/后保存。

我在做这一切错误的方式吗?有一种更简单的方法可以实际工作吗?

谢谢!

+0

这是我的解决方案http://stackoverflow.com/questions/1221878/why-does-django-post-save-signal-give-me-pre-save-data/9172783#9172783 – Fatih 2012-02-07 08:04:27

我有一个类似的问题,我想我可以解决它。我不知道你是如何使用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 

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