Django Rest Framework - Could not resolve URL for hyperlinked relationship using view name “field-detail”

Pregunta de la clase:
Bernardo Augusto García Loaiza

Bernardo Augusto García Loaiza

Pregunta
student
hace 9 años

Hola amigos. Tengo un problema renderizando una lista de objetos en DRF. De pronto pueden porfa darme una mano.

Tengo el siguiente modelo con una clave primaria personalizada:

<code> classField(models.Model): FIELD_TYPE_NATURE = 'Grama natural' FIELD_TYPE_ARTIFICIAL = 'Grama sintetica' FIELD_TYPE_CHOICES = ( (FIELD_TYPE_NATURE, u'Grama natural'), (FIELD_TYPE_ARTIFICIAL, u'Grama sintetica'), ) MODALITY_11 = 'Fútbol 11' MODALITY_8 = 'Fútbol 8' MODALITY_CHOICES = ( (MODALITY_11, u'Fútbol 11'), (MODALITY_8, u'Fútbol 8'), ) name = models.CharField( max_length=150, unique=True, db_index=True, primary_key=True, ) field_type = models.CharField( choices=FIELD_TYPE_CHOICES, default=False, blank=False, max_length=20, verbose_name=('Tipo de material/grama de la cancha') ) modality = models.CharField( max_length=40, blank=False, verbose_name='Modalidad' ) photo = models.ImageField(upload_to='fields', blank=True, null=True) def__str__(self): return'%s %s %s' % (self.name, self.field_type, self.location)

Mi serializador es el siguiente:

<code> class FieldSerializer(serializers.HyperlinkedModelSerializer): #url = serializers.HyperlinkedIdentityField(view_name='field-detail',) class Meta: model = Field fields = ('url', 'name','field_type','modality','photo','location')

Mi viewset y mi router

<code> class FieldViewSet(viewsets.ModelViewSet): queryset = Field.objects.all() serializer_class = FieldSerializer
<code> router = routers.DefaultRouter() router.register(r'fields', FieldViewSet)

Y mi url:

url(r'^api/', include(router.urls)),

Cuando voy a mi url

<url>/api/fields
obtengo este mensaje.

<code> File "/home/bgarcial/.virtualenvs/fuupbol2/lib/python3.5/site-packages/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 "field-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.** [11/Nov/2016 16:39:53] "GET /api/fields/ HTTP/1.1" 500 187477

Decido utilizar

HyperlinkedIdentityField
http://www.django-rest-framework.org/api-guide/relations/#hyperlinkedidentityfield en mi clase
FieldSerializer

<code> class FieldSerializer(serializers.HyperlinkedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='field-detail',) class Meta: model = Field fields = ('url', 'name','field_type','modality','photo','location')

Y obtengo el mismo error.

Django me dice que por defecto seestá generando una vista de tipo

<model-name>-detail
y es porque segun la documentación,
router
automaticamente crea una vista
detail
con el nombre del modelo para un
ViewSet

En la documentaciónen el parametro

view_name
lo dice http://www.django-rest-framework.org/api-guide/relations/#hyperlinkedidentityfield

Tengo una duda y puede ser porque no comprendo del todo los procesos de serialización …

Si yo estoy queriendo obtener una lista de objetos con

<url>/api/fields
¿no deberia tener esto?:

url = serializers.HyperlinkedIdentityField(view_name='field-list',)

No entiendo las situaciones en las cuales deba usar los atrubutos

view_name
en relación a si deseo obtener una lista de objetos o un detalle de uno de ellos ensu serialización con DRF.

Aunque aquí explican algo de ello http://stackoverflow.com/a/26989845/2773461

Se que en la documentación esta, pero ¿cuando debo utilizar

HyperlinkedModelSerializer
y
ModelSerializer
?

Agradezco un poco de orientación aca en caso de ser posible. Muchas gracias.

1 respuestas
para escribir tu comentario
    Bernardo Augusto García Loaiza

    Bernardo Augusto García Loaiza

    student
    hace 9 años

    Cuando yo declaro mi vista como

    fields
    en los routers, debo utilizar
    fields-detail
    como valor en el atributo
    view_name
    para el
    HyperLinkedIdentityField

    Asi solucioné el problema:

    `classFieldSerializer(serializers.HyperlinkedModelSerializer):

    url = serializers.HyperlinkedIdentityField(view_name=‘fields-detail’,)

    classMeta: model = Field fields = ('url', 'name','field_type','modality','photo','location')`
Curso de Python y Django 2016

Curso de Python y Django 2016

Aprende Python desde cero y crea tu primera aplicación web completa en Django. Entiende las bases del lenguaje, sus funciones, conoce cómo conectarte a bases de datos y termina creando una API REST de manera profesional para tu app.

Curso de Python y Django 2016
Curso de Python y Django 2016

Curso de Python y Django 2016

Aprende Python desde cero y crea tu primera aplicación web completa en Django. Entiende las bases del lenguaje, sus funciones, conoce cómo conectarte a bases de datos y termina creando una API REST de manera profesional para tu app.