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)