user4910881
user4910881

Reputation:

Django rest framework/simplejson error __init__() got an unexpected keyword argument

I've found this issue with django-rest-framework TypeError at /rest/events/ __init__() got an unexpected keyword argument 'iterable_as_array'

error tracelog:

Environment:


Request Method: GET
Request URL: http://www.kenyabuzz.com/rest/events/

Django Version: 1.5.5
Python Version: 2.7.9
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.sitemaps',
 'django.contrib.messages',
 'django.contrib.markup',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.redirects',
 'django.contrib.humanize',
 'autocomplete_light',
 'memcache_status',
 'djangorestframework',
 'haystack',
 'lamusoftware.generic',
 'mptt',
 'bootstrapform',
 'sorl.thumbnail',
 'south',
 'oauth2client',
 'articles',
 'banners',
 'common',
 'directory',
 'events',
 'galleries',
 'marketplace',
 'movies',
 'pages',
 'profiles',
 'search',
 'stats',
 'minidetector',
 'mobile',
 'reports',
 'favorites',
 'braces',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'allauth.socialaccount.providers.facebook',
 'widget_tweaks',
 'wordofmouth',
 'ckeditor',
 'django_mobile',
 'debug_toolbar')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
 'minidetector.Middleware',
 'mobileesp.middleware.MobileDetectionMiddleware',
 'kb.middleware.log_ip_middleware.SetRemoteAddrFromForwardedFor',
 'kb.middleware.log_ip_middleware.RedirectMovie')


Traceback:
File "/home/kbuzz/lib/python2.7/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/kbuzz/lib/python2.7/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/home/kbuzz/lib/python2.7/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)
File "/home/kbuzz/lib/python2.7/django/views/decorators/csrf.py" in wrapped_view
  77.         return view_func(*args, **kwargs)
File "/home/kbuzz/webapps/django/lib/python2.7/djangorestframework/views.py" in dispatch
  246.         return self.final(request, response, *args, **kwargs)
File "/home/kbuzz/webapps/django/lib/python2.7/djangorestframework/views.py" in final
  199.         return self.render(response)
File "/home/kbuzz/webapps/django/lib/python2.7/djangorestframework/mixins.py" in render
  251.             content = renderer.render(response.cleaned_content, media_type)
File "/home/kbuzz/webapps/django/lib/python2.7/djangorestframework/renderers.py" in render
  325.         content = self._get_content(self.view, self.view.request, obj, media_type)
File "/home/kbuzz/webapps/django/lib/python2.7/djangorestframework/renderers.py" in _get_content
  227.         content = renderers[0](view).render(obj, media_type)
File "/home/kbuzz/webapps/django/lib/python2.7/djangorestframework/renderers.py" in render
  113.         return json.dumps(obj, cls=DateTimeAwareJSONEncoder, indent=indent, sort_keys=sort_keys)
File "/home/kbuzz/lib/python2.7/simplejson/__init__.py" in dumps
  397.         **kw).encode(obj)

Exception Type: TypeError at /rest/events/
Exception Value: __init__() got an unexpected keyword argument 'iterable_as_array'

I checked online for similar issues and found suggestions that the issue would be solved with the latest update. I've upgraded to 3.3.1 but this didn't solve the issue. I checked the source of the error simplejson and there's a report of a similar issue from 10 days ago. This issue started after I started upgrading all the django apps to the latest version.

The error log doesn't trace it to the views but the class handling it below might be improved to resolve the issue.

class SearchListModelView(PaginatorMixin, View):
    django_model = None
    #permissions = (IsAuthenticated,)

    def get(self, request, *args, **kwargs):

        sqs = SearchQuerySet()
        filtered = False
        parent = None

        filter_data = dict(request.GET.items())

        # Not able to get named args from kwargs. Empty for some reason.
        # This will have to do for now
        slugs = request.path.strip('/').split('/')
        if len(slugs) == 4:
            dm = slugs[-1]
            # __exact is also returning 'restaurants-bars' for 'restaurants'
            # 'uniquerestaurantsunique' is a workaround for all slug search
            slug = 'unique%sunique' % slugs[-2]
            parent_dm = slugs[-3]

            sqs_parent = SearchQuerySet().filter(django_ct=slug_to_django_model(parent_dm), slug__exact=slug)
            sr_id = None
            for sr in sqs_parent:
                sr_id = sr.pk
            if sr_id:
                if parent_dm == dm:
                    fil= 'parent__exact'
                elif parent_dm == 'venues':
                    fil = 'venue__exact'
                else:
                    fil = parent_dm + '__exact'
                sqs = sqs.filter(**{fil:sr_id})
                filtered = True

        # Filter on django model
        if self.django_model is None:
            self.django_model = self._resource.django_model
        if self.django_model:
            sqs = sqs.filter(django_ct=self.django_model)
            filtered = True

        valid_fields = self._resource.fields

        valid_index_fields = []

        # If no model (free text) use common.category
        if self.django_model:
            search_index = connections['default'].get_unified_index().get_index(get_model(*self.django_model.split('.')))
            valid_index_fields = search_index.fields

        # Check to ensure that each filter key is a valid field in the model

        free_text = False

        for filter_key,value in filter_data.iteritems():
            filter_args = filter_key.split("__")
            if len(filter_args) == 2:
                key, op = filter_args[0], filter_args[1]
            else:
                key, op = filter_key, None
            if key in valid_fields and key in valid_index_fields:
                if op == 'in':
                    value = value.split(',')
                if isinstance(value, list):
                    value_items = []
                    for item in value:
                        value_items.append(convert_string_into_object(item, valid_index_fields[key]))
                    value = value_items
                else:
                    value = convert_string_into_object(value, valid_index_fields[key])
                if filter_key == 'slug__exact':
                    value = 'unique%sunique' % value
                    sqs = sqs.filter(slug__exact=value)
                else:
                    sqs = sqs.filter(**{ filter_key:value })
                filtered = True
            elif key == 'django_ct' and op:
                print key, op, value
                sqs = sqs.filter(django_ct__in=value.split(','))
                filtered = True
            elif key == 'content':
                sqs = sqs.filter(content=AutoQuery(value))
                filtered = True
                free_text = True

        # Do not allow all data to be returned
        if not filtered:
            del sqs
            return []

        if self.django_model == 'movies.show':
            #print 'sqs.all(): ', sqs.all()
            movies = list(set([show.movie for show in sqs.all()]))
            #print 'movies: ', movies
            sqs = SearchQuerySet().filter(django_ct='movies.movie', i__in=movies)

        # For the API sorting is required on some models
        if self._resource and self._resource.sortorder and not free_text:
            sqs = sqs.order_by(*self._resource.sortorder)
        return sqs.all() 

Upvotes: 3

Views: 1979

Answers (1)

Linovia
Linovia

Reputation: 20966

Simplejson 3.3.1 was released before the fix was merged. You need to either wait or use the current master branch for simplejson.

Upvotes: 1

Related Questions