haudoing
haudoing

Reputation: 613

How to modify a model after bulk update in django?

I try some code like this:

mymodels = MyModel.objects.filter(status=1)
mymodels.update(status=4)
print(mymodels)

And the result is an empty list

I know that I can use a for loop to replace the update.

But it will makes a lot of update query.

Is there anyway to continue manipulate mymodels after the bulk update?

Upvotes: 1

Views: 195

Answers (2)

Ponytech
Ponytech

Reputation: 1684

mymodels = MyModel.objects.filter(status=1)
objs = [obj for obj in mymodels] # save the objects you are about to update
mymodels.update(status=4)
print(objs)

should work.

Explanations why had been given by Timmy O'Mahony.

Upvotes: 2

Timmy O'Mahony
Timmy O'Mahony

Reputation: 53998

Remember that Django's QuerySets are lazy:

QuerySets are lazy – the act of creating a QuerySet doesn’t involve any database activity. You can stack filters together all day long, and Django won’t actually run the query until the QuerySet is evaluated

but the update() method function is actually applied immediately:

The update() method is applied instantly, and the only restriction on the QuerySet that is updated is that it can only update columns in the model’s main table, not on related models.

So while - in your code - are applying the update call after your filter, in reality it is being applied beforehand and therefore your objects status is being changed before the filter is (lazily) applied, meaning there are no matching records and the result is empty.

Upvotes: 3

Related Questions