Почему в одном случае после GET-запроса я получаю старый набор данных, а в другом - актуальный.

Я делаю POST запрос, вношу данные в таблицу, но после этого я делаю Get и получаю старые данные в этом случае

def get_queryset(self):
    transaction.commit()

    if self.action not in ['retrieve', 'list', 'create', 'selector']:
        res = self.queryset.filter(is_editable=True)
    else:
        res = self.queryset

    return res

Актуальные данные)

def get_queryset(self):
    transaction.commit()

    if self.action not in ['retrieve', 'list', 'create', 'selector']:
        res = self.queryset.filter(is_editable=True)
    else:
        res = Presence.objects.all()

    return res

QuerySets кэширует значение. Это означает, что если вы напрямую вернете self.queryset, он выполнит запрос один раз и сохранит значения в памяти.

Если вы добавляете .all(), вы делаете копию QuerySet без кэша, и вы, таким образом, заставляете делать новый запрос.

Поэтому ListView по умолчанию имеет реализацию, в которой он возвращает queryset.all(). Действительно, если мы посмотрим на исходный код [GitHub], то увидим:

    def get_queryset(self):
        """
        Return the list of items for this view.
        The return value must be an iterable and may be an instance of
        `QuerySet` in which case `QuerySet` specific behavior will be enabled.
        """
        if self.queryset is not None:
            queryset = self.queryset
            if isinstance(queryset, QuerySet):
                queryset = queryset.all()
        elif self.model is not None:
            queryset = self.model._default_manager.all()
        else:
            raise ImproperlyConfigured(
                "%(cls)s is missing a QuerySet. Define "
                "%(cls)s.model, %(cls)s.queryset, or override "
                "%(cls)s.get_queryset()." % {
                    'cls': self.__class__.__name__
                }
            )
        ordering = self.get_ordering()
        if ordering:
            if isinstance(ordering, str):
                ordering = (ordering,)
            queryset = queryset.order_by(*ordering)

        return queryset
Вернуться на верх