#python #python-3.x #django #django-models
#python #python-3.x #django #django-модели
Вопрос:
Я искал вокруг, и я не думаю, что я нашел свой ответ совсем еще. Но я хочу иметь возможность находить различия в данных и иметь список имен столбцов, которые показывают это.
Возьмем, к примеру, у меня есть модель, которая просто называется my_model, в которой есть несколько столбцов.
object = my_model.objects.get(id=1)
# Perform edit some values.
old_object = my_model.objects.get(id=1)
object.save()
# Check for differences
model_fields = [field.name for field in my_model._meta.get_fields()]
filtered_list = filter(lambda field: getattr(object, field, None) != getattr(old_object, field, None), model_fields)
Цель этого — уведомить пользователя после того, как он внесет обновление на своей стороне, чтобы отправить электронное письмо этому пользователю, чтобы просто напомнить ему, что они изменили все значения, которые они изменили.
Комментарии:
1. Библиотека
django-simple-history
может быть вам полезна.2. @RossRogers Я видел это, мое дело в том, насколько велики накладные расходы, которые это увеличивает время обработки?
3.
django-simple-history
добавляет параллельную таблицу со всеми одинаковыми полями, а также некоторые поля истории, такие какhistory_time
,history_edit
,history_user
,history_change_reason
. Когда вы смотрите на различия, вы запрашиваете эту таблицу аудита полностью отдельно от вашей обычной таблицы. Вы получаете к нему доступ, какFoo.history.filter(id=42, history_time_gte='2021-12-06-19:30')
и c. В любом случае, отдельные данные, поэтому размер данных более чем удваивается. Зависит от ваших требований, но я нашел это очень простым. Нужна таблица аудита?history = HistoricalRecords()
на этой модели и бам! Выполнено.
Ответ №1:
Смог ответить на мой собственный вопрос. Преобразование двух объектов в словари. Я смог получить что-то вроде
dict1, dict2 = obj1.__dict__, obj2._dict__
changed_fields = {
'column_names': []
}
excluded_keys = '_state'
for k,v in dict1.items():
if k in excluded_keys:
continue
try:
if v != dict2[k]
changed_fields['column_names'].append(k)
except KeyError:
# Put error handling
continue