Skip to content

Deecopy error when using exclusion #171

Closed
@feuloren

Description

@feuloren

Hi,

I just upgraded to rest-framework-filters 0.10 (+ rest-framework 3.6 and django-filter 1.0), and can't use the exclusion feature anymore, because of a deepcopy error.

Here is my filter set:

import rest_framework_filters as filters

class RefillFilterSet(filters.FilterSet):
    class Meta:
        model = models.Refill
        fields = {
            'kind': ['exact', 'in'],
        }

Here is the full trackeback (ran as part of unit tests), the query paramters were "kind!=toBeIgnored"

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.4/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/usr/local/lib/python3.4/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python3.4/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.4/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/local/lib/python3.4/site-packages/rest_framework/viewsets.py", line 83, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/local/lib/python3.4/site-packages/rest_framework/views.py", line 483, in dispatch
    response = self.handle_exception(exc)
  File "/usr/local/lib/python3.4/site-packages/rest_framework/views.py", line 443, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/usr/local/lib/python3.4/site-packages/rest_framework/views.py", line 480, in dispatch
    response = handler(request, *args, **kwargs)
  File "/usr/local/lib/python3.4/site-packages/rest_framework/mixins.py", line 40, in list
    queryset = self.filter_queryset(self.get_queryset())
  File "/usr/local/lib/python3.4/site-packages/rest_framework/generics.py", line 151, in filter_queryset
    queryset = backend().filter_queryset(self.request, queryset, self)
  File "/usr/local/lib/python3.4/site-packages/rest_framework_filters/backends.py", line 34, in filter_queryset
    return super(DjangoFilterBackend, self).filter_queryset(request, queryset, view)
  File "/usr/local/lib/python3.4/site-packages/django_filters/rest_framework/backends.py", line 51, in filter_queryset
    return filter_class(request.query_params, queryset=queryset, request=request).qs
  File "/usr/local/lib/python3.4/site-packages/rest_framework_filters/filterset.py", line 259, in qs
    requested_filters = self.expand_filters()
  File "/usr/local/lib/python3.4/site-packages/rest_framework_filters/filterset.py", line 118, in expand_filters
    f = copy.deepcopy(f)
  File "/usr/local/lib/python3.4/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/local/lib/python3.4/copy.py", line 300, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/lib/python3.4/copy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "/usr/local/lib/python3.4/copy.py", line 246, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/local/lib/python3.4/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/local/lib/python3.4/copy.py", line 300, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/lib/python3.4/copy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "/usr/local/lib/python3.4/copy.py", line 246, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/local/lib/python3.4/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/local/lib/python3.4/copy.py", line 300, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/lib/python3.4/copy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "/usr/local/lib/python3.4/copy.py", line 246, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/local/lib/python3.4/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/local/lib/python3.4/copy.py", line 300, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/lib/python3.4/copy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "/usr/local/lib/python3.4/copy.py", line 246, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/local/lib/python3.4/copy.py", line 166, in deepcopy
    y = copier(memo)
TypeError: cannot deepcopy this match object

With a real HTTP request I get a similar error, but on a different object:
TypeError: cannot serialize '_io.BufferedReader' object

My dependencies versions:

Django==1.10.4
django-crispy-forms==1.6.1
django-filter==1.0.2
djangorestframework==3.6.2
djangorestframework-filters==0.10.0

Do you know what's going on ?
My only guess is that deepcopy reaches the django request object (through filter._parent) and fails to copy an un-pickeable object, but it doesn't explain why it works with djangorestframework-filters 0.9.1 + django-filter 0.15.3.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions