Django Найти разницу в том же экземпляре модели

#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