#33319: Query.change_aliases raises an AssertionError -------------------------------------+------------------------------------- Reporter: Ömer Faruk Abacı | Owner: Vishal | Pandey Type: Bug | Status: assigned Component: Database layer | Version: 3.2 (models, ORM) | Severity: Normal | Resolution: Keywords: | Triage Stage: Accepted Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+-------------------------------------
Comment (by Vishal Pandey): Replying to [comment:4 Simon Charette]: Thank you for your helping hand. I tried two approaches to solve this issue by tweaking `table_alias` method of Query class, and it works with the above-attested sample code, but unfortunately, both of them fail with few testcases. By both the approaches, I am trying to resolve the conflicts between the change_map's keys and its values 1st approach: {{{ if alias_list: from random import choice alias = '%s%d' % (choice(ascii_uppercase), len(self.alias_map) + 1) alias_list.append(alias) }}} Here, I am randomly choosing an uppercase letter as the first character of alias, this returns different aliases, but a test_case is failing with this approach, with the following traceback. {{{ FAIL: test_multiple_search_fields (admin_changelist.tests.ChangeListTests) [<object object at 0x7fc0aa886cf0>] (search_string='Tiny Desk Concert') All rows containing each of the searched words are returned, where each ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib/python3.8/unittest/case.py", line 60, in testPartExecutor yield File "/usr/lib/python3.8/unittest/case.py", line 582, in subTest yield File "/home/vishal/Desktop/open_source/django/tests/admin_changelist/tests.py", line 550, in test_multiple_search_fields group_changelist = group_model_admin.get_changelist_instance(request) File "/home/vishal/Desktop/open_source/django/django/contrib/admin/options.py", line 742, in get_changelist_instance return ChangeList( File "/home/vishal/Desktop/open_source/django/django/contrib/admin/views/main.py", line 100, in __init__ self.queryset = self.get_queryset(request) File "/home/vishal/Desktop/open_source/django/django/contrib/admin/views/main.py", line 498, in get_queryset qs = self.root_queryset.filter(Exists(qs)) File "/home/vishal/Desktop/open_source/django/django/db/models/query.py", line 977, in filter return self._filter_or_exclude(False, args, kwargs) File "/home/vishal/Desktop/open_source/django/django/db/models/query.py", line 995, in _filter_or_exclude clone._filter_or_exclude_inplace(negate, args, kwargs) File "/home/vishal/Desktop/open_source/django/django/db/models/query.py", line 1002, in _filter_or_exclude_inplace self._query.add_q(Q(*args, **kwargs)) File "/home/vishal/Desktop/open_source/django/django/db/models/sql/query.py", line 1374, in add_q clause, _ = self._add_q(q_object, self.used_aliases) File "/home/vishal/Desktop/open_source/django/django/db/models/sql/query.py", line 1395, in _add_q child_clause, needed_inner = self.build_filter( File "/home/vishal/Desktop/open_source/django/django/db/models/sql/query.py", line 1263, in build_filter condition = filter_expr.resolve_expression(self, allow_joins=allow_joins) File "/home/vishal/Desktop/open_source/django/django/db/models/expressions.py", line 248, in resolve_expression c.set_source_expressions([ File "/home/vishal/Desktop/open_source/django/django/db/models/expressions.py", line 249, in <listcomp> expr.resolve_expression(query, allow_joins, reuse, summarize) File "/home/vishal/Desktop/open_source/django/django/db/models/sql/query.py", line 1035, in resolve_expression clone.bump_prefix(query) File "/home/vishal/Desktop/open_source/django/django/db/models/sql/query.py", line 925, in bump_prefix self.change_aliases({ File "/home/vishal/Desktop/open_source/django/django/db/models/sql/query.py", line 848, in change_aliases assert set(change_map).isdisjoint(change_map.values()) AssertionError }}} In 2nd approach, I have rotated the `alias_prefix` in a circular manner from T(class variable `alias_prefix` has value T) to Z, then from A to Z, and so on, and it also works on the above-attested code but fails five other test cases. {{{ if alias_list: alias = '%s%d' % (self.alias_prefix, len(self.alias_map) + 1) self.alias_prefix = chr(ord(self.alias_prefix)+1) if chr(ord(self.alias_prefix)+1) <= 'Z' else 'A' alias_list.append(alias) }}} I feel something needs to be tweaked here only to solve the problem, but because of my limited knowledge of the underlying codebase, I am not being able to solve it. I seek help from my fellow senior developers to solve this issue. -- Ticket URL: <https://code.djangoproject.com/ticket/33319#comment:7> 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/072.f7b4a7cb9c67ec7db71ca9626aa28409%40djangoproject.com.