Итак, в моем коде есть сигнал 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
крючком?
Спасибо.