gpt4 book ai didi

django-models - Django : cannot detect changes on many-to-many field with m2m_changed signal - auditing at model-level

转载 作者:行者123 更新时间:2023-12-04 17:04:54 25 4
gpt4 key购买 nike

我想跟踪任何模型上的哪些字段发生了变化(即在模型级别进行审计,因为它更具原子性,而不是像 django 和 django-reversion 已经可以做的那样在管理/表单级别)。我可以使用前/后保存/删除信号对任何字段执行此操作。但是,我在 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 字段上执行前/后保存。

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

谢谢!

最佳答案

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

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

关于django-models - Django : cannot detect changes on many-to-many field with m2m_changed signal - auditing at model-level,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4744794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com