#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 django-updates+unsubscr...@googlegroups.com.
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