[Python] Does `.all()` in Django re-query the Database or use the cache?

Discussão em 'Python' iniciado por Stack, Fevereiro 2, 2025.

  1. Stack

    Stack Membro Participativo

    I am getting very conflicting messages. From Django Queryset docs, I am reading (https://docs.djangoproject.com/en/5.1/ref/models/querysets/#django.db.models.query.QuerySet.all):


    When a QuerySet is evaluated, it typically caches its results. If the data in the database might have changed since a QuerySet was evaluated, you can get updated results for the same query by calling all() on a previously evaluated QuerySet.
    ​

    But then under the prefetch_related section, it shows that using .all() on the sub-objects uses results from the cache:

    >>> restaurants = Restaurant.objects.prefetch_related(
    ... Prefetch("pizzas", queryset=queryset),
    ... )
    >>> vegetarian_pizzas = restaurants[0].pizzas.all()


    Here, apparently vegetarian_pizzas doesn't trigger a database query.

    So...which is it - what does all() actually do? Why does it trigger a database query on the outer but then not for sub-objects? I'm confused.

    Continue reading...

Compartilhe esta Página