djangodjango-modelsdjango-simple-history

How to track changes when using update() in Django models


I'm trying to keep track of the changes whenever a field is changed.

I can see the changes in Django Admin History whenever I use the .save() method, but whenever I use the .update() method it does not record whatever I changed in my object.

I want to use update() because it can change multiple fields at the same time. It makes the code cleaner and more efficient (one query, one line...)

Right now I'm using this:

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

I can see all the changes when I do

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

I'm also using django-simple-history to see the changes.setup.


Solution

  • From the docs:

    Finally, realize that update() does an update at the SQL level and, thus, does not call any save() methods on your models, nor does it emit the pre_save or post_save signals (which are a consequence of calling Model.save())

    update() works at the DB level, so Django admin cannot track changes when updates are applied via .update(...).

    If you still want to track the changes on updates, you can use:

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

    This is however more expensive and is not advisable if the only benefit is tracking changes via the admin history.