Estoy construyendo un proyecto en Django Rest Framework donde los usuarios pueden iniciar sesión para ver su bodega. Mis ModelViewSets funcionaban bien y, de repente, aparece este frustrante error:
No se pudo resolver la URL para la relación de hipervínculo usando el nombre de vista "detalles de usuario". Es posible que no haya incluido el modelo relacionado en su API o haya configurado incorrectamente el
lookup_field
atributo en este campo.
El rastreo muestra:
[12/Dec/2013 18:35:29] "GET /bottles/ HTTP/1.1" 500 76677
Internal Server Error: /bottles/
Traceback (most recent call last):
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/viewsets.py", line 78, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 399, in dispatch
response = self.handle_exception(exc)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 396, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/mixins.py", line 96, in list
return Response(serializer.data)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 535, in data
self._data = [self.to_native(item) for item in obj]
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 325, in to_native
value = field.field_to_native(obj, field_name)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/relations.py", line 153, in field_to_native
return self.to_native(value)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/relations.py", line 452, in to_native
raise Exception(msg % view_name)
Exception: Could not resolve URL for hyperlinked relationship using view
name "user-detail". You may have failed to include the related model in
your API, or incorrectly configured the `lookup_field` attribute on this
field.
Tengo un modelo de usuario de correo electrónico personalizado y el modelo de botella en models.py es:
class Bottle(models.Model):
wine = models.ForeignKey(Wine, null=False)
user = models.ForeignKey(User, null=False, related_name='bottles')
Mis serializadores:
class BottleSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Bottle
fields = ('url', 'wine', 'user')
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('email', 'first_name', 'last_name', 'password', 'is_superuser')
Mis puntos de vista:
class BottleViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows bottles to be viewed or edited.
"""
queryset = Bottle.objects.all()
serializer_class = BottleSerializer
class UserViewSet(ListCreateAPIView):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
y finalmente la url:
router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')
urlpatterns = patterns('',
url(r'^', include(router.urls)),
# ...
No tengo una vista de detalles de usuario y no veo de dónde podría venir este problema. ¿Algunas ideas?
Gracias
fuente
También encontré este error y lo resolví de la siguiente manera:
La razón es que olvidé dar "** - detalle" (view_name, por ejemplo: user-detail) un espacio de nombres. Entonces, Django Rest Framework no pudo encontrar esa vista.
Hay una aplicación en mi proyecto, supongamos que el nombre de mi proyecto es
myproject
y el nombre de la aplicación esmyapp
.Hay dos archivos urls.py, uno es
myproject/urls.py
y el otro esmyapp/urls.py
. Le doy a la aplicación un espacio de nombresmyproject/urls.py
, como:Registré el resto de los enrutadores del marco
myapp/urls.py
y luego recibí este error.Mi solución fue proporcionar URL con espacio de nombres explícitamente:
Y resolvió mi problema.
fuente
extra_kwargs = {'url': {'view_name': 'myapp:user-detail'}}
Tal vez alguien pueda echarle un vistazo a esto: http://www.django-rest-framework.org/api-guide/routers/
Si usa espacio de nombres con serializadores hipervínculos, también deberá asegurarse de que cualquier parámetro view_name en los serializadores refleje correctamente el espacio de nombres. Por ejemplo:
Debería incluir un parámetro como,
view_name='api:user-detail'
por ejemplo, para los campos del serializador hipervinculados a la vista de detalles del usuario.fuente
urls.py
fue anidado doblemente en minewsite
proyecto: (1)newsite/urls.py
(creado por django) (2)polls/urls.py
(3)polls/api/v1/urls.py
............ Tengo que mencionar el nombre anidado usandourl = serializers.HyperlinkedIdentityField(view_name="polls:polls_api:user-detail")
Otro error desagradable que causa este error es tener el nombre_base definido innecesariamente en su urls.py. Por ejemplo:
Esto provocará el error mencionado anteriormente. Saca ese nombre_base de ahí y vuelve a una API que funcione. El siguiente código solucionaría el error. ¡Hurra!
Sin embargo, probablemente no solo agregó arbitrariamente el nombre_base, es posible que lo haya hecho porque definió un def get_queryset () personalizado para la Vista, por lo que Django exige que agregue el nombre_base. En este caso, deberá definir explícitamente la 'url' como HyperlinkedIdentityField para el serializador en cuestión. Observe que estamos definiendo este HyperlinkedIdentityField EN EL SERIALIZER de la vista que arroja el error. Si mi error fuera "No se pudo resolver la URL para la relación de hipervínculo usando el nombre de vista" estudio-detalle ". Es posible que no haya incluido el modelo relacionado en su API o haya configurado incorrectamente el
lookup_field
atributo en este campo". Podría arreglar esto con el siguiente código.Mi ModelViewSet (el get_queryset personalizado es la razón por la que tuve que agregar el base_name al router.register () en primer lugar):
Mi registro de enrutador para este ModelViewSet en urls.py:
¡Y AQUÍ ESTÁ EL DINERO! Entonces podría resolverlo así:
Sí. Debe definir explícitamente este HyperlinkedIdentityField en sí mismo para que funcione. Y debe asegurarse de que lo
view_name
definido en HyperlinkedIdentityField sea el mismo que definióbase_name
en urls.py con un '-detail' agregado después.fuente
<app_name>:studies-detail
. Por ejemplo, si se llama a mi aplicacióntanks
, entonces la ruta completa seríaHyperlinkedIdentityField(view_name="tanks:studies-detail")
. Para averiguarlo , usé elshow_urls
comando django-exensions , para ver la ruta completa y la etiqueta que el enrutador estaba haciendo automáticamente.Este código también debería funcionar.
fuente
UserSerializer
debe implementarse (no está listo para importar), como se muestra en django-rest-framework.org/api-guide/serializersMe encontré con este error después de agregar un espacio de nombres a mi url
y agregando app_name a mi urls.py
Resolví esto especificando NamespaceVersioning para mi api de marco de descanso en settings.py de mi proyecto
fuente
Hoy, tengo el mismo error y los cambios a continuación me rescatan.
Cambio
a:
fuente
Mismo error, pero diferente razón:
Defino un modelo de usuario personalizado, nada nuevo campo:
Esta es mi función de vista:
Como no me rendí
queryset
directamenteUserViewSet
, tengo que establecerbase_name
cuándo registro este conjunto de vistas. Aquí es donde mi mensaje de error causado por elurls.py
archivo:Necesita lo
base_name
mismo que el nombre de su modelo -customuser
.fuente
Si está extendiendo los GenericViewSet y ListModelMixin clases, y tienen el mismo error al añadir la url campo en la vista de lista, es porque no estás definiendo la vista de detalle. Asegúrese de extender el mixin RetrieveModelMixin :
fuente
Parece que
HyperlinkedModelSerializer
no estoy de acuerdo con tener un caminonamespace
. En mi aplicación hice dos cambios.En el archivo de URL importado
Espero que esto ayude.
fuente
Me encontré con el mismo error mientras seguía la guía de inicio rápido de DRF http://www.django-rest-framework.org/tutorial/quickstart/ y luego intentaba navegar a / users. He hecho esta configuración muchas veces antes sin problemas.
Mi solución no estaba en el código sino en reemplazar la base de datos.
La diferencia entre esta instalación y las otras anteriores fue cuando creé la base de datos local.
Esta vez corrí mi
inmediatamente después de correr
En lugar del orden exacto que aparece en la guía.
Sospeché que algo no se creó correctamente en la base de datos. No me importaba mi db de desarrollo, así que lo eliminé y ejecuté el
./manage.py migrate
comando una vez más, creé un superusuario, navegué hasta / users y el error desapareció.Algo fue problemático con el orden de operaciones en el que configuré DRF y la base de datos.
Si está utilizando sqlite y puede probar el cambio a una base de datos nueva, vale la pena intentarlo antes de analizar todo su código.
fuente
Botella = serializadores.PrimaryKeyRelatedField (read_only = True)
read_only le permite representar el campo sin tener que vincularlo a otra vista del modelo.
fuente
Recibí ese error en DRF 3.7.7 cuando un valor de slug estaba vacío (igual a '') en la base de datos.
fuente
Me encontré con este mismo problema y lo resolví agregando
generics.RetrieveAPIView
como clase base a mi conjunto de vistas.fuente
Estuve atrapado en este error durante casi 2 horas:
Configurado incorrectamente en / api_users / users / 1 / No se pudo resolver la URL para la relación de hipervínculo usando el nombre de vista "detalles de usuarios". Es posible que no haya incluido el modelo relacionado en su API o haya configurado incorrectamente el
lookup_field
atributo en este campo.Cuando finalmente obtengo la solución pero no entiendo por qué, entonces mi código es:
pero en mis URL principales, era:
Entonces, para finalmente resolver el problema de borrar el espacio de nombres:
Y finalmente resuelvo mi problema, para que cualquiera pueda decirme por qué, mejor.
fuente
Si omite los campos 'id' y 'url' de su serializador, no tendrá ningún problema. Puede acceder a las publicaciones utilizando la identificación que se devuelve en el objeto json de todos modos, lo que facilita aún más la implementación de su interfaz.
fuente
Tuve el mismo problema, creo que deberías revisar tu
get_absolute_url
título del valor de entrada del método del modelo de objeto (** kwargs). y use el nombre de campo exacto en lookup_field
fuente