#35198: Facet filters crash for queryset with no ID.
-------------------------------------+-------------------------------------
     Reporter:  Simon Alef           |                    Owner:  Shafiya
                                     |  Adzhani
         Type:  Bug                  |                   Status:  assigned
    Component:  contrib.admin        |                  Version:  5.0
     Severity:  Release blocker      |               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 Shafiya Adzhani):

 Replying to [ticket:35198 Simon Alef]:
 > Description:
 > Our Django application defines a relational model where Customer
 entities have a one-to-many relationship with Contracts, and Contract
 entities have a one-to-many relationship with Rental Items. A custom admin
 filter (RentalItemsFilter) was implemented on the Customer model to enable
 filtering based on the presence of active Rental Items.
 >
 > Issue:
 > Using the "show counts" feature within the RentalItemsFilter on the
 Customer admin page to display counts of devices (Rental Items) associated
 with each customer through contracts triggers an exception.
 >
 > Steps to Reproduce:
 > Load fixtures from fixture.json
 > Go to the Django admin dashboard and navigate to the Customer model
 section.
 > Click on "Show counts".
 >
 >
 >
 > {{{
 > Traceback:
 > Request Method: GET
 > Request URL: http://127.0.0.1:8000/admin/demo/customer/?_facets=True
 >
 > Django Version: 5.0.2
 > Python Version: 3.11.7
 > Installed Applications:
 > ['django.contrib.admin',
 >  'django.contrib.auth',
 >  'django.contrib.contenttypes',
 >  'django.contrib.sessions',
 >  'django.contrib.messages',
 >  'django.contrib.staticfiles',
 >  'demo']
 > Installed Middleware:
 > ['django.middleware.security.SecurityMiddleware',
 >  'django.contrib.sessions.middleware.SessionMiddleware',
 >  'django.middleware.common.CommonMiddleware',
 >  'django.middleware.csrf.CsrfViewMiddleware',
 >  'django.contrib.auth.middleware.AuthenticationMiddleware',
 >  'django.contrib.messages.middleware.MessageMiddleware',
 >  'django.middleware.clickjacking.XFrameOptionsMiddleware']
 >
 >
 > Template error:
 > In template /django_bug_report/.venv/lib/python3.11/site-
 packages/django/contrib/admin/templates/admin/change_list.html, error at
 line 87
 >    no such column: demo_rentalitem.id
 >    77 :             <h2>{% translate 'Filter' %}</h2>
 >    78 :             {% if cl.is_facets_optional or cl.has_active_filters
 %}<div id="changelist-filter-extra-actions">
 >    79 :               {% if cl.is_facets_optional %}<h3>
 >    80 :                 {% if cl.add_facets %}<a href="{{
 cl.remove_facet_link }}" class="hidelink">{% translate "Hide counts"
 %}</a>
 >    81 :                 {% else %}<a href="{{ cl.add_facet_link }}"
 class="viewlink">{% translate "Show counts" %}</a>{% endif %}
 >    82 :               </h3>{% endif %}
 >    83 :               {% if cl.has_active_filters %}<h3>
 >    84 :                 <a href="{{ cl.clear_all_filters_qs }}">&#10006;
 {% translate "Clear all filters" %}</a>
 >    85 :               </h3>{% endif %}
 >    86 :             </div>{% endif %}
 >    87 :             {% for spec in cl.filter_specs %} {%
 admin_list_filter cl spec %} {% endfor %}
 >    88 :           </div>
 >    89 :         {% endif %}
 >    90 :       {% endblock %}
 >    91 :     </div>
 >    92 :   </div>
 >    93 : {% endblock %}
 >    94 :
 >
 > Traceback (most recent call last):
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/backends/utils.py", line 105, in _execute
 >     return self.cursor.execute(sql, params)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/backends/sqlite3/base.py", line 329, in execute
 >     return super().execute(query, params)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >
 > The above exception (no such column: demo_rentalitem.id) was the direct
 cause of the following exception:
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/core/handlers/exception.py", line 55, in inner
 >     response = get_response(request)
 >                ^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/core/handlers/base.py", line 220, in _get_response
 >     response = response.render()
 >                ^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/response.py", line 114, in render
 >     self.content = self.rendered_content
 >                    ^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/response.py", line 92, in rendered_content
 >     return template.render(context, self._request)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/backends/django.py", line 61, in render
 >     return self.template.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 171, in render
 >     return self._render(context)
 >            ^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 163, in _render
 >     return self.nodelist.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in render
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in <listcomp>
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 961, in render_annotated
 >     return self.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/loader_tags.py", line 159, in render
 >     return compiled_parent._render(context)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 163, in _render
 >     return self.nodelist.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in render
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in <listcomp>
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 961, in render_annotated
 >     return self.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/loader_tags.py", line 159, in render
 >     return compiled_parent._render(context)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 163, in _render
 >     return self.nodelist.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in render
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in <listcomp>
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 961, in render_annotated
 >     return self.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/loader_tags.py", line 65, in render
 >     result = block.nodelist.render(context)
 >              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in render
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in <listcomp>
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 961, in render_annotated
 >     return self.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/loader_tags.py", line 65, in render
 >     result = block.nodelist.render(context)
 >              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in render
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in <listcomp>
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 961, in render_annotated
 >     return self.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/defaulttags.py", line 326, in render
 >     return nodelist.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in render
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 1000, in <listcomp>
 >     return SafeString("".join([node.render_annotated(context) for node
 in self]))
 >                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 961, in render_annotated
 >     return self.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/defaulttags.py", line 242, in render
 >     nodelist.append(node.render_annotated(context))
 >                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/base.py", line 961, in render_annotated
 >     return self.render(context)
 >            ^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/template/library.py", line 237, in render
 >     output = self.func(*resolved_args, **resolved_kwargs)
 >              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/contrib/admin/templatetags/admin_list.py", line 505, in
 admin_list_filter
 >     "choices": list(spec.choices(cl)),
 >                ^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/contrib/admin/filters.py", line 150, in choices
 >     facet_counts = self.get_facet_queryset(changelist) if add_facets
 else None
 >                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/contrib/admin/filters.py", line 87, in get_facet_queryset
 >     return filtered_qs.aggregate(
 >
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/models/query.py", line 604, in aggregate
 >     return self.query.chain().get_aggregation(self.db, kwargs)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/models/sql/query.py", line 615, in get_aggregation
 >     result = compiler.execute_sql(SINGLE)
 >              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/models/sql/compiler.py", line 1562, in execute_sql
 >     cursor.execute(sql, params)
 >     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/backends/utils.py", line 122, in execute
 >     return super().execute(sql, params)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/backends/utils.py", line 79, in execute
 >     return self._execute_with_wrappers(
 >
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/backends/utils.py", line 92, in _execute_with_wrappers
 >     return executor(sql, params, many, context)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/backends/utils.py", line 100, in _execute
 >     with self.db.wrap_database_errors:
 >     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/utils.py", line 91, in __exit__
 >     raise dj_exc_value.with_traceback(traceback) from exc_value
 >     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/backends/utils.py", line 105, in _execute
 >     return self.cursor.execute(sql, params)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >   File "/django_bug_report/.venv/lib/python3.11/site-
 packages/django/db/backends/sqlite3/base.py", line 329, in execute
 >     return super().execute(query, params)
 >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 >
 > Exception Type: OperationalError at /admin/demo/customer/
 > Exception Value: no such column: demo_rentalitem.id
 >
 > }}}

 Based on the image I attached above, I'm wondering if this behavior is as
 expected? If so, instead of using SimpleListFilter, it used
 RelatedFieldListFilter.
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35198#comment:4>
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018db5ab2796-03bf63d0-7d71-4311-b3a5-066a1109998e-000000%40eu-central-1.amazonses.com.

Reply via email to