django-json-api / django-rest-framework-json-api

JSON:API support for Django REST framework
https://django-rest-framework-json-api.readthedocs.org/
BSD 2-Clause "Simplified" License
1.18k stars 294 forks source link

Filtering by a field that starts with "filter" fails #1248

Closed Roanmh closed 2 weeks ago

Roanmh commented 2 weeks ago

Description of the Bug Report

We have a model with a field filter_query and we want to support filtering by this field. The query param filter_query=foo always fails with the message "invalid query parameter: filter_query". However the query parameter of the other syntax works: filter[filter_query]=foo.

The error is thrown from here.

Traceback
Traceback (most recent call last):
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/django/core/handlers/exception.py", line 56, in inner
    response = get_response(request)
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/django/template/response.py", line 114, in render
    self.content = self.rendered_content
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/rest_framework/response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/rest_framework/renderers.py", line 723, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/rest_framework/renderers.py", line 701, in get_context
    'filter_form': self.get_filter_form(data, view, request),
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/rest_framework/renderers.py", line 633, in get_filter_form
    html = backend().to_html(request, queryset, view)
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/django_filters/rest_framework/backends.py", line 99, in to_html
    filterset = self.get_filterset(request, queryset, view)
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/rest_framework_json_api/django_filters/backends.py", line 91, in get_filterset
    kwargs = self.get_filterset_kwargs(request, queryset, view)
  File "/Users/haydenr/.pyenv/versions/3.12.5/envs/proj/lib/python3.12/site-packages/rest_framework_json_api/django_filters/backends.py", line 114, in get_filterset_kwargs
    raise ValidationError(f"invalid query parameter: {qp}")

I think the regex is matching this field as an instance of the filter[param] syntax erroneously.

Checklist

Roanmh commented 2 weeks ago

It came to my attention that JSON:API doesn't allow the <filter>=<value> syntax at all. This is not a bug then, since the error message is correct: "filter_query" is an invalid query parameter according to JSON:API spec.