Получить много-много изменений полей в записи сохранить в Django 1.11 - PullRequest
1 голос
/ 07 апреля 2020

Итак, в моем коде есть сигнал post_save для сохранения журналов изменений в моделях, но изменения во многих или многих полях не применяются в точке post_save срабатывает, поэтому изменения в полях m2m не отображаются. не сохранены в моих журналах.

Мой код (вы можете в значительной степени игнорировать код внутри метода):

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)

Например, рассмотрим модель Event, которая имеет много ко многим полям EventCategory называется categories. Если изменения были внесены в событие через UpdateView, например (включая изменения в categories), и вызван метод, если я сделаю event.categories.all(), он покажет предыдущие категории без изменений.

Я могу использовать сигнал m2m_changed для сохранения журналов, но он будет создавать отдельные журналы, и, например, если кто-то изменил категории с [A, B, C] на [A, B, D], он вызовет два раз, один для удаления C, а другой для удаления D, в результате чего много журналов. Я могу делать такие вещи, как групповые журналы, основываясь на пользователе и времени создания журнала (если журналы были созданы в течение 1 секунды, я могу объединить их или что-то в этом роде).

Есть ли что-то, что я могу сделать, чтобы изменения внутри метод с post_save крючком?

Спасибо.

...