Search code examples
pythondjangobooleanlxmlkeyerror

python lxml throwing key error bool while processing kwargs as dict


I'm trying to chain Django Q() objects with code piece below:

excludes = None
for val in service_dict.values():
    field_filter_name = field_name.format(val)
    exclude_filter = {field_filter_name + "__isnull": True}
    if excludes is None:
        excludes = Q(**exclude_filter)
    else:
        excludes |= Q(**exclude_filter)

On run time, when code hit to excludes = Q(**exclude_filter) line on first loop, throwing this error:

File "/lib/python3.6/site-packages/lxml/builder.py", line 218, in call
    get(dict)(elem, attrib)
File "/lib/python3.6/site-packages/lxml/builder.py", line 205, in add_dict
    attrib[k] = typemap[type(v)](None, v)
KeyError: <class 'bool'>

I'm quite certain that the values are string type. But this is working on python shell in the same environment:

In [9]: Q(**{"foo__isnull": True})
Out[9]: <Q: (AND: ('foo__isnull', True))>

I also tried outside of the environment:

>>> a = {'foo': True}
>>> def k(foo):
...     print(foo)
... 
>>> k(**a)
True

On the other hand; that kind of usage of the kwargs are working at any other part of the code.

How could this issue be solved?

EDIT:

Full traceback:

Traceback (most recent call last):
  File "/env/lib/python3.6/site-packages/django/contrib/staticfiles/handlers.py", line 63, in __call__
    return self.application(environ, start_response)
  File "/env/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 170, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in get_response
    response = self._middleware_chain(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/env/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/project/foobar/products/views.py", line 1267, in product_list_view
    filters, excludes = apply_filters(request)
  File "/project/foobar/products/views.py", line 1085, in apply_filters
    excludes = Q(**exclude_filter)
  File "/env/lib/python3.6/site-packages/lxml/builder.py", line 218, in __call__
    get(dict)(elem, attrib)
  File "/env/lib/python3.6/site-packages/lxml/builder.py", line 205, in add_dict
    attrib[k] = typemap[type(v)](None, v)
KeyError: <class 'bool'>

Solution

  • Presumably you have instantiated an lxml object and called it Q earlier in your code, which is overwriting the Q object you imported from django.db.models. Rename the object.