2016-06-21 2 views
0

Я пытаюсь отслеживать изменения всякий раз, когда изменяется поле.Как отслеживать изменения при использовании update() в моделях Django

Я вижу изменения в истории администратора Django всякий раз, когда я использую метод .save(), но всякий раз, когда я использую метод .update(), он не записывает все, что я изменил в своем объекте.

Я хочу использовать update(), потому что он может изменять несколько полей одновременно. Это делает уборщик кода и более эффективный (один запрос, одна линии ...)

Сейчас я использую это:

u = Userlist.objects.filter(username=user['username']).update(**user) 

Я могу увидеть все изменения, когда я

u = Userlist.objects.get(username=user['username']) 
u.lastname=lastname 
u.save() 

Я также использую django-simple-history, чтобы увидеть change.setup.

ответ

0

От docs:

Наконец, понимаю, что update() делает обновление на уровне SQL и таким образом, не вызывает каких-либо save() методы ваших моделей, а также не излучать pre_save или post_save сигналы (которые являются следствием вызова Model.save())

update() работает на уровне БД, поэтому Django администратора не может отслеживать изменения, когда обновления применяются через .update(...).

Если вы все еще хотите, чтобы отслеживать изменения на обновления, вы можете использовать:

for user in Userlist.objects.filter(age__gt=40): 
    user.lastname = 'new name' 
    user.save() 

Это, однако, более дорогой и не рекомендуется, если только выгода отслеживания изменений через историю администратора.

+0

Прискорбно, что нет декоратора, чтобы заставить сигнал такого поведения ... – mk2

+0

Я не встречал никого. Старый хак работает (см. Мое обновление), но не рекомендуется –

+0

Да, я сохранил поля, которые я менял в списке, а затем я повторил их, чтобы изменить один за другим. Наконец, я бы сохранил новый объект. Это немного дороже вычислительно дорого, и он менее чист, но мне нужно отслеживать изменения ... Спасибо, Моисей. – mk2

Смежные вопросы