Почему в одном случае после 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