I am not able to cache or even pickle a queryset that has a Subquery or OuterRef. Getting the error:
-- ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.
Here is my queryset:
qs = self.queryset.filter( Q(user__in=Follow.objects.filter( follower=userid, ).values('followee')) \ | Q(user=userid))\ .prefetch_related('postlike_set')\ .annotate(Count('postlike'))\ .annotate(Count('postcomment'))\ .annotate( liked=Subquery( PostLike.objects.filter(user=self.request.user, post_id=OuterRef('id'), ).values('user') ) ) cache.set(f'feed:{userid}', qs)And here is the output:
File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django_redis/client/default.py", line 326, in encode value = self._serializer.dumps(value) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django_redis/serializers/pickle.py", line 32, in dumps return pickle.dumps(value, self._pickle_version) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/query.py", line 224, in __getstate__ self._fetch_all() File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/query.py", line 1179, in _fetch_all self._result_cache = list(self._iterable_class(self)) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/query.py", line 107, in __iter__ for row in compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size): File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1014, in results_iter results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1050, in execute_sql sql, params = self.as_sql() File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 458, in as_sql where, w_params = self.compile(self.where) if self.where is not None else ("", []) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 390, in compile sql, params = node.as_sql(self, self.connection) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/sql/where.py", line 80, in as_sql sql, params = compiler.compile(child) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 390, in compile sql, params = node.as_sql(self, self.connection) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/fields/related_lookups.py", line 130, in as_sql return super().as_sql(compiler, connection) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/lookups.py", line 161, in as_sql rhs_sql, rhs_params = self.process_rhs(compiler, connection) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/lookups.py", line 260, in process_rhs return super().process_rhs(compiler, connection) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/lookups.py", line 90, in process_rhs sql, params = compiler.compile(value) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 390, in compile sql, params = node.as_sql(self, self.connection) File "/Users/my-app/app/venv-app/lib/python3.6/site-packages/django/db/models/expressions.py", line 536, in as_sql 'This queryset contains a reference to an outer query and may ' ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/37899bb2-6858-4c05-b471-877f9a0fd199%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
No comments:
Post a Comment