[Fixed]-Using existing field values in django update query

39👍

You can do this using an F expression:

from django.db.models import F
tasks = Task.objects.filter(task_definition__cascades=False)
    .update(shared_task_id=F('id'))

There are some restrictions on what you can do with F objects in an update call, but it’ll work fine for this case:

Calls to update can also use F expressions to update one field based on the value of another field in the model.

However, unlike F() objects in filter and exclude clauses, you can’t introduce joins when you use F() objects in an update – you can only reference fields local to the model being updated. If you attempt to introduce a join with an F() object, a FieldError will be raised[.]

https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once

5👍

I stumbled upon this topic and noticed Django’s limitation of updates with foreign keys, so I now use raw SQL in Django:

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("UPDATE a JOIN b ON a.b_id = b.id SET a.myField = b.myField")
👤Peter

Leave a comment