Skip to content

Commit

Permalink
Fixed #27403 -- Doc'd that QuerySet.prefetch_related() doesn't guaran…
Browse files Browse the repository at this point in the history
…tee transactional consistency.

Added a note about the potential race condition in prefetch_related()
that could produce an inconsistent result, one that does not correspond
to any point in the database history.
  • Loading branch information
timb07 authored and felixxm committed Oct 25, 2023
1 parent 64060d1 commit ee10425
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions docs/ref/models/querysets.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1211,6 +1211,19 @@ results; these ``QuerySets`` are then used in the ``self.toppings.all()`` calls.
The additional queries in ``prefetch_related()`` are executed after the
``QuerySet`` has begun to be evaluated and the primary query has been executed.

Note that there is no mechanism to prevent another database query from altering
the items in between the execution of the primary query and the additional
queries, which could produce an inconsistent result. For example, if a
``Pizza`` is deleted after the primary query has executed, its toppings will
not be returned in the additional query, and it will seem like the pizza has no
toppings:

.. code-block:: pycon

>>> Pizza.objects.prefetch_related("toppings")
# "Hawaiian" Pizza was deleted in another shell.
<QuerySet [<Pizza: Hawaiian ()>, <Pizza: Seafood (prawns, smoked salmon)>]>

If you have an iterable of model instances, you can prefetch related attributes
on those instances using the :func:`~django.db.models.prefetch_related_objects`
function.
Expand Down

0 comments on commit ee10425

Please sign in to comment.