Wednesday, July 25, 2018

Cannot pickle queryset with Subquery and OuterRef

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