#30769: Access Json Key over annotated field in subquery ----------------------------------+-------------------------------------- Reporter: Tim Kleinschmidt | Owner: nobody Type: Uncategorized | Status: new Component: Uncategorized | Version: 1.11 Severity: Normal | Resolution: Keywords: | Triage Stage: Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 ----------------------------------+-------------------------------------- Description changed by Tim Kleinschmidt:
Old description: > {{{ > TypeError: can only concatenate tuple (not "list") to tuple > File "django/core/handlers/exception.py", line 41, in inner > response = get_response(request) > File "django/core/handlers/base.py", line 187, in _get_response > response = self.process_exception_by_middleware(e, request) > File "django/core/handlers/base.py", line 185, in _get_response > response = wrapped_callback(request, *callback_args, > **callback_kwargs) > File "django/contrib/auth/decorators.py", line 23, in _wrapped_view > return view_func(request, *args, **kwargs) > File "apps/dashboard/companies/employee_list.py", line 395, in > company_employee_view > RequestConfig(request, paginate={'per_page': 25}).configure(table) > File "django_tables2/config.py", line 59, in configure > table.paginate(**kwargs) > File "django_tables2/tables.py", line 526, in paginate > self.page = self.paginator.page(page) > File "django/core/paginator.py", line 57, in page > number = self.validate_number(number) > File "django/core/paginator.py", line 46, in validate_number > if number > self.num_pages: > File "django/utils/functional.py", line 35, in __get__ > res = instance.__dict__[self.name] = self.func(instance) > File "django/core/paginator.py", line 91, in num_pages > if self.count == 0 and not self.allow_empty_first_page: > File "django/utils/functional.py", line 35, in __get__ > res = instance.__dict__[self.name] = self.func(instance) > File "django/core/paginator.py", line 84, in count > return len(self.object_list) > File "django_tables2/rows.py", line 341, in __len__ > length = len(self.data) > File "django_tables2/data.py", line 140, in __len__ > self._length = self.data.count() > File "django/db/models/query.py", line 364, in count > return self.query.get_count(using=self.db) > File "django/db/models/sql/query.py", line 499, in get_count > number = obj.get_aggregation(using, ['__count'])['__count'] > File "django/db/models/sql/query.py", line 463, in get_aggregation > outer_query.add_subquery(inner_query, using) > File "django/db/models/sql/subqueries.py", line 209, in add_subquery > self.subquery, self.sub_params = > query.get_compiler(using).as_sql(with_col_aliases=True) > File "django/db/models/sql/compiler.py", line 441, in as_sql > where, w_params = self.compile(self.where) if self.where is not None > else ("", []) > File "django/db/models/sql/compiler.py", line 373, in compile > sql, params = node.as_sql(self, self.connection) > File "django/db/models/sql/where.py", line 79, in as_sql > sql, params = compiler.compile(child) > File "django/db/models/sql/compiler.py", line 373, in compile > sql, params = node.as_sql(self, self.connection) > File "django/db/models/sql/where.py", line 79, in as_sql > sql, params = compiler.compile(child) > File "django/db/models/sql/compiler.py", line 373, in compile > sql, params = node.as_sql(self, self.connection) > File "django/db/models/lookups.py", line 169, in as_sql > lhs_sql, params = self.process_lhs(compiler, connection) > File "django/db/models/lookups.py", line 160, in process_lhs > compiler, connection, lhs) > File "django/db/models/lookups.py", line 82, in process_lhs > return compiler.compile(lhs) > File "django/db/models/sql/compiler.py", line 373, in compile > sql, params = node.as_sql(self, self.connection) > File "django/contrib/postgres/fields/jsonb.py", line 110, in as_sql > return '(%s %s %%s)' % (lhs, self.operator), params + [lookup] > AttributeError: 'BoundRows' object has no attribute 'count' > File "django/core/paginator.py", line 79, in count > return self.object_list.count() > }}} > > Code which leads to the error > {{{ > # Base Query Construct > auth_query = > UserAuth.objects.filter(user_id=OuterRef('user_id')).order_by( > '-received_at')[:1] > base_employees = ( > base_employees.annotate(auth_received_at=Subquery(auth_query.values('received_at')), > auth_response=Subquery(auth_query.values('response')))) > > # Q object building > q = Q() > if IS_AUTH_REJECTED in auth_status: > q |= Q(auth_response__REJECTED='N') > > base_employees.filter(q) > }}} > > Workaround > {{{ > # base query construct > auth_query = UserAuth.objects.annotate( > has_access=KeyTextTransform('REJECTED', 'response') > ).filter(user_id=OuterRef('user_id')).order_by('-received_at')[:1] > > base_employees = base_employees.annotate( > auth_received_at=Subquery(auth_query.values('received_at')), > has_access=Subquery(auth_query.values('has_access'), > output_field=CharField())) > > # q object creation > q = Q() > if IS_AUTH_REJECTED in auth_status: > q |= Q(has_access='N') > > base_employees.filter(q) > > }}} New description: {{{ TypeError: can only concatenate tuple (not "list") to tuple File "django/core/handlers/exception.py", line 41, in inner response = get_response(request) File "django/core/handlers/base.py", line 187, in _get_response response = self.process_exception_by_middleware(e, request) File "django/core/handlers/base.py", line 185, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "django/contrib/auth/decorators.py", line 23, in _wrapped_view return view_func(request, *args, **kwargs) File "apps/dashboard/companies/employee_list.py", line 395, in company_employee_view RequestConfig(request, paginate={'per_page': 25}).configure(table) File "django_tables2/config.py", line 59, in configure table.paginate(**kwargs) File "django_tables2/tables.py", line 526, in paginate self.page = self.paginator.page(page) File "django/core/paginator.py", line 57, in page number = self.validate_number(number) File "django/core/paginator.py", line 46, in validate_number if number > self.num_pages: File "django/utils/functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "django/core/paginator.py", line 91, in num_pages if self.count == 0 and not self.allow_empty_first_page: File "django/utils/functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "django/core/paginator.py", line 84, in count return len(self.object_list) File "django_tables2/rows.py", line 341, in __len__ length = len(self.data) File "django_tables2/data.py", line 140, in __len__ self._length = self.data.count() File "django/db/models/query.py", line 364, in count return self.query.get_count(using=self.db) File "django/db/models/sql/query.py", line 499, in get_count number = obj.get_aggregation(using, ['__count'])['__count'] File "django/db/models/sql/query.py", line 463, in get_aggregation outer_query.add_subquery(inner_query, using) File "django/db/models/sql/subqueries.py", line 209, in add_subquery self.subquery, self.sub_params = query.get_compiler(using).as_sql(with_col_aliases=True) File "django/db/models/sql/compiler.py", line 441, in as_sql where, w_params = self.compile(self.where) if self.where is not None else ("", []) File "django/db/models/sql/compiler.py", line 373, in compile sql, params = node.as_sql(self, self.connection) File "django/db/models/sql/where.py", line 79, in as_sql sql, params = compiler.compile(child) File "django/db/models/sql/compiler.py", line 373, in compile sql, params = node.as_sql(self, self.connection) File "django/db/models/sql/where.py", line 79, in as_sql sql, params = compiler.compile(child) File "django/db/models/sql/compiler.py", line 373, in compile sql, params = node.as_sql(self, self.connection) File "django/db/models/lookups.py", line 169, in as_sql lhs_sql, params = self.process_lhs(compiler, connection) File "django/db/models/lookups.py", line 160, in process_lhs compiler, connection, lhs) File "django/db/models/lookups.py", line 82, in process_lhs return compiler.compile(lhs) File "django/db/models/sql/compiler.py", line 373, in compile sql, params = node.as_sql(self, self.connection) File "django/contrib/postgres/fields/jsonb.py", line 110, in as_sql return '(%s %s %%s)' % (lhs, self.operator), params + [lookup] AttributeError: 'BoundRows' object has no attribute 'count' File "django/core/paginator.py", line 79, in count return self.object_list.count() }}} Code which leads to the error {{{ # Base Query Construct auth_query = UserAuth.objects.filter(user_id=OuterRef('user_id')).order_by( '-received_at')[:1] base_employees = ( base_employees.annotate(auth_received_at=Subquery(auth_query.values('received_at')), auth_response=Subquery(auth_query.values('response')))) # Q object building q = Q() if IS_AUTH_REJECTED in auth_status: q |= Q(auth_response__REJECTED='N') base_employees.filter(q) }}} Workaround {{{ # base query construct auth_query = UserAuth.objects.annotate( has_access=KeyTextTransform('REJECTED', 'response') ).filter(user_id=OuterRef('user_id')).order_by('-received_at')[:1] base_employees = base_employees.annotate( auth_received_at=Subquery(auth_query.values('received_at')), has_access=Subquery(auth_query.values('has_access'), output_field=CharField())) # q object creation q = Q() if IS_AUTH_REJECTED in auth_status: q |= Q(has_access='N') base_employees.filter(q) }}} -- -- Ticket URL: <https://code.djangoproject.com/ticket/30769#comment:1> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/064.fb288e8b3d26b3634bd400c98ad62999%40djangoproject.com.