Python 在Django 1.11中的后期保存中获取多对多字段更改

Python 在Django 1.11中的后期保存中获取多对多字段更改,python,django,django-signals,Python,Django,Django Signals,因此,我的代码中有一个post_save信号来保存模型中的更改日志,但在触发post_save时,多对多字段中的更改不会应用,因此m2m字段中的更改不会保存在我的日志中 我的代码(您几乎可以忽略方法中的代码): 例如,考虑一个模型事件< /代码>,它有多对多字段到事件类别被称为代码>类别< /代码>。例如,如果通过UpdateView对事件进行了更改(包括对类别的更改),并且调用了该方法,则如果我执行事件.categories.all(),它将显示以前的类别,而不显示更改 我可以使用m2m_ch

因此,我的代码中有一个
post_save
信号来保存模型中的更改日志,但在触发
post_save
时,多对多字段中的更改不会应用,因此m2m字段中的更改不会保存在我的日志中

我的代码(您几乎可以忽略方法中的代码):

例如,考虑一个模型<代码>事件< /代码>,它有多对多字段到<代码>事件类别被称为代码>类别< /代码>。例如,如果通过UpdateView对事件进行了更改(包括对

类别的更改
),并且调用了该方法,则如果我执行
事件.categories.all()
,它将显示以前的类别,而不显示更改

我可以使用
m2m_changed
信号保存日志,但它会创建单独的日志,例如,如果有人将类别从[A,B,C]更改为[A,B,D],它会触发两次,一次用于删除C,另一次用于删除D,从而导致大量日志。我可以根据用户和日志创建时间对日志进行分组(如果日志是在1秒内创建的,我可以将它们合并或进行其他操作)

我是否可以通过
post\u save
hook来获取方法内部的更改


谢谢。

您能使用
m2m\u changed
并用m2m信息更新刚刚保存的日志吗?是的,但我如何才能获取日志?我想我可以在所有日志中搜索由用户创建并在一秒钟内创建的对象,并更新该日志,但在我看来,这不是一个理想的解决方案。我使用的是Django LogEntry模型。顺便说一句,你能使用
m2m_changed
并用m2m信息更新刚刚保存的日志吗?是的,但我如何获取日志?我想我可以在所有日志中搜索由用户创建并在一秒钟内创建的对象,并更新该日志,但在我看来,这不是一个理想的解决方案。顺便说一句,我使用的是Django LogEntry模型。
def save_log(sender, instance, created, raw, update_fields, **kwargs):
    if (
        not hasattr(sender, '_meta') or
        sender._meta.label not in settings.MODELS_TO_BE_LOGGED
    ):
        return

    sensitive_fields = ['password', ]

    user = get_user()

    # This creates the log with a json describing the changes
    if created:
        # This method creates a log
        instance.save_addition(user, '')
    else:
        changed_field_labels = {}
        original_dict = instance.original_dict
        actual_dict = instance.to_dict(
            exclude=['created_at', 'updated_at', 'original_dict', 'id'],
        )

        change = False
        for key in set(list(actual_dict.keys()) + list(original_dict.keys())):
            if original_dict.get(key) != actual_dict.get(key):
                change = True
                if key == sensitive_fields:
                    changed_field_labels[key] = {'change': 'field updated'}
                else:
                    changed_field_labels[key] = {
                        'from': original_dict.get(key, '-'),
                        'to': actual_dict.get(key, '-'),
                    }

        if change:
            json_message = json.dumps(
                {'changed': {'fields': changed_field_labels}},
                cls=ModelEncoder
            )
            # This method creates a log
            instance.save_edition(user, json_message)