Project

Profile

Help

Issue #2414

`ImproperlyConfigured` exception in for detail list view endpoint

Added by amacdona@redhat.com almost 3 years ago. Updated 6 months ago.

Status:
CLOSED - NOTABUG
Priority:
Normal
Assignee:
-
Category:
-
Sprint/Milestone:
Start date:
Due date:
Severity:
2. Medium
Version:
Platform Release:
Blocks Release:
OS:
Backwards Incompatible:
No
Triaged:
Yes
Groomed:
No
Sprint Candidate:
No
Tags:
QA Contact:
Complexity:
Smash Test:
Verified:
No
Verification Required:
No
Sprint:

Description

`HyperlinkedRelatedField` for detail list views are passed incorrect `view_names`.

As an example, this should be the most simple working detail importer serializer possible:

class TestImporterSerializer(ImporterSerializer):
    # _href is provided by the base class, which is a subclass of `MasterModelSerializer`

    class Meta:
        model = TestImporter
        fields = ImporterSerializer.Meta.fields

This creates the following error from Django (viewed from the browsable web API):

ImproperlyConfigured at /api/v3/importers/test/

Could not resolve URL for hyperlinked relationship using view name "testimporter-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

Request Method:     GET
Request URL:     http://192.168.121.160:8000/api/v3/importers/test/
Django Version:     1.8.16
Exception Type:     ImproperlyConfigured
Exception Value:     

Could not resolve URL for hyperlinked relationship using view name "testimporter-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

Exception Location:     /usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/relations.py in to_representation, line 386
Python Executable:     /home/vagrant/.virtualenvs/pulp/bin/python
Python Version:     3.5.2
Python Path:     

['/home/vagrant/devel/pulp/app/pulp/app',
 '/home/vagrant/.virtualenvs/pulp/lib64/python35.zip',
 '/home/vagrant/.virtualenvs/pulp/lib64/python3.5',
 '/home/vagrant/.virtualenvs/pulp/lib64/python3.5/plat-linux',
 '/home/vagrant/.virtualenvs/pulp/lib64/python3.5/lib-dynload',
 '/usr/lib64/python3.5',
 '/usr/lib/python3.5',
 '/home/vagrant/.virtualenvs/pulp/lib/python3.5/site-packages',
 '/home/vagrant/devel/devel/pulp-dev',
 '/home/vagrant/devel/pulp/app',
 '/usr/lib/python3.5/site-packages/psycopg2-2.6.2-py3.5-linux-x86_64.egg',
 '/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg',
 '/usr/lib/python3.5/site-packages/django_filter-0.15.3-py3.5.egg',
 '/usr/lib/python3.5/site-packages/django_extensions-1.7.4-py3.5.egg',
 '/usr/lib/python3.5/site-packages/django_crispy_forms-1.6.1-py3.5.egg',
 '/usr/lib/python3.5/site-packages/Django-1.8.16-py3.5.egg',
 '/usr/lib/python3.5/site-packages/coreapi-2.0.9-py3.5.egg',
 '/usr/lib/python3.5/site-packages/celery-4.0.0-py3.5.egg',
 '/usr/lib/python3.5/site-packages/uritemplate-3.0.0-py3.5.egg',
 '/usr/lib/python3.5/site-packages/itypes-1.1.0-py3.5.egg',
 '/usr/lib/python3.5/site-packages/kombu-4.0.0-py3.5.egg',
 '/usr/lib/python3.5/site-packages/billiard-3.5.0.2-py3.5.egg',
 '/usr/lib/python3.5/site-packages/pytz-2016.7-py3.5.egg',
 '/usr/lib/python3.5/site-packages/amqp-2.1.1-py3.5.egg',
 '/usr/lib/python3.5/site-packages/vine-1.1.3-py3.5.egg',
 '/home/vagrant/devel/pulp/plugin',
 '/home/vagrant/devel/pulp/exceptions',
 '/home/vagrant/devel/pulp/client_lib',
 '/home/vagrant/devel/pulp/common',
 '/home/vagrant/devel/pulp/client_consumer',
 '/home/vagrant/devel/pulp/devel',
 '/home/vagrant/devel/pulp/server',
 '/home/vagrant/devel/pulp/bindings',
 '/home/vagrant/devel/pulp/client_admin',
 '/home/vagrant/devel/pulp/streamer',
 '/usr/lib/python3.5/site-packages/Twisted-16.5.0-py3.5-linux-x86_64.egg',
 '/home/vagrant/devel/pulp/repoauth',
 '/home/vagrant/devel/pulp/oid_validation',
 '/home/vagrant/devel/pulp/tasking',
 '/usr/lib64/python3.5/site-packages',
 '/usr/lib/python3.5/site-packages',
 '/usr/lib/python3.5/site-packages',
 '/home/vagrant/devel/pulp']

Server time:     Thu, 10 Nov 2016 19:16:43 +0000

This is the traceback from the server:

Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/Django-1.8.16-py3.5.egg/django/core/handlers/base.py", line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3.5/site-packages/Django-1.8.16-py3.5.egg/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/viewsets.py", line 83, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/views.py", line 477, in dispatch
    response = self.handle_exception(exc)
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/views.py", line 437, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/views.py", line 474, in dispatch
    response = handler(request, *args, **kwargs)
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/mixins.py", line 45, in list
    return self.get_paginated_response(serializer.data)
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/serializers.py", line 725, in data
    ret = super(ListSerializer, self).data
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/serializers.py", line 643, in to_representation
    self.child.to_representation(item) for item in iterable
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/serializers.py", line 643, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "/home/vagrant/devel/pulp/app/pulp/app/serializers/base.py", line 187, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "/usr/lib/python3.5/site-packages/djangorestframework-3.5.3-py3.5.egg/rest_framework/relations.py", line 386, in to_representation
    raise ImproperlyConfigured(msg % self.view_name)
django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "importers-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

The problem is that the view_name being passed to the HyperlinedRelatedField is `testimporter-detail`, which does not exist. What should be created is `<master_names>-<detail_name>-detail`, which in this example would be importers-test-detail.

There is a workaround, the plugin writer just needs to override `_href` with the correct view_name, but this isn't ideal and should be handled by the base class.

class TestImporterSerializer(ImporterSerializer):
    _href = serializers.HyperlinkedIdentityField(view_name='importers-test-detail')

    class Meta:
        model = TestImporter
        fields = ImporterSerializer.Meta.fields

History

#1 Updated by amacdona@redhat.com almost 3 years ago

  • Description updated (diff)

#2 Updated by dkliban@redhat.com almost 3 years ago

  • Blocked by Task #2325: Distribute Pulp with Pulp added

#3 Updated by dkliban@redhat.com almost 3 years ago

  • Blocked by deleted (Task #2325: Distribute Pulp with Pulp)

#4 Updated by bizhang almost 3 years ago

  • Groomed changed from No to Yes
  • Tags Pulp 3 added

#5 Updated by bizhang almost 3 years ago

  • Triaged changed from No to Yes
  • Groomed changed from Yes to No

#6 Updated by amacdona@redhat.com over 2 years ago

  • Status changed from NEW to CLOSED - NOTABUG

#7 Updated by Connihington 6 months ago

Exception in for detail list view endpoint is the point which is seriously given in this blog. Such blogs are always ideal just because of write my dissertation given points. I would love to share the value of this blog.

#8 Updated by Alberills 6 months ago

When i join this blog reading profession i don't know the importance of this profession but when i come to fruition site and read the articles then i got the true meaning of it.

#9 Updated by daviddavis 6 months ago

  • Sprint/Milestone set to 3.0

#10 Updated by bmbouter 6 months ago

  • Tags deleted (Pulp 3)

Please register to edit this issue

Also available in: Atom PDF