Je construis un projet dans Django Rest Framework où les utilisateurs peuvent se connecter pour voir leur cave à vin. Mes ModelViewSets fonctionnaient très bien et tout d'un coup, j'obtiens cette erreur frustrante:
Impossible de résoudre l'URL de la relation hypertexte à l'aide du nom de vue "user-detail". Vous n'avez peut-être pas réussi à inclure le modèle associé dans votre API ou configuré incorrectement l'
lookup_field
attribut dans ce champ.
Le retraçage montre:
[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.
J'ai un modèle d'utilisateur de messagerie personnalisé et le modèle de bouteille dans models.py est:
class Bottle(models.Model):
wine = models.ForeignKey(Wine, null=False)
user = models.ForeignKey(User, null=False, related_name='bottles')
Mes sérialiseurs:
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')
Mes vues:
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
et enfin l'url:
router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')
urlpatterns = patterns('',
url(r'^', include(router.urls)),
# ...
Je n'ai pas de vue détaillée de l'utilisateur et je ne vois pas d'où ce problème pourrait provenir. Des idées?
Merci
Je suis également tombé sur cette erreur et je l'ai résolue comme suit:
La raison en est que j'ai oublié de donner un espace de noms à "** - detail" (nom_vue, par exemple: détail utilisateur). Ainsi, Django Rest Framework n'a pas pu trouver cette vue.
Il y a une application dans mon projet, supposons que le nom de mon projet soit
myproject
et que le nom de l'application soitmyapp
.Il existe deux fichiers urls.py, l'un est
myproject/urls.py
et l'autre estmyapp/urls.py
. Je donne à l'application un espace de nomsmyproject/urls.py
, tout comme:J'ai enregistré les routeurs du cadre de repos
myapp/urls.py
, puis j'ai obtenu cette erreur.Ma solution était de fournir explicitement l'URL avec l'espace de noms:
Et cela a résolu mon problème.
la source
extra_kwargs = {'url': {'view_name': 'myapp:user-detail'}}
Peut-être que quelqu'un peut jeter un œil à ceci: http://www.django-rest-framework.org/api-guide/routers/
Si vous utilisez un espace de noms avec des sérialiseurs hyperliés, vous devrez également vous assurer que tous les paramètres view_name sur les sérialiseurs reflètent correctement l'espace de noms. Par exemple:
vous devez inclure un paramètre tel que
view_name='api:user-detail'
pour les champs de sérialiseur hyperliens vers la vue détaillée de l'utilisateur.la source
urls.py
était double imbriqué dans monnewsite
projet: (1)newsite/urls.py
(créé par django) (2)polls/urls.py
(3)polls/api/v1/urls.py
............ Je dois mentionner le nom imbriqué en utilisanturl = serializers.HyperlinkedIdentityField(view_name="polls:polls_api:user-detail")
Une autre mauvaise erreur qui cause cette erreur est d'avoir le nom_base inutilement défini dans votre urls.py. Par exemple:
Cela provoquera l'erreur indiquée ci-dessus. Sortez ce nom_base de là et revenez à une API fonctionnelle. Le code ci-dessous corrigera l'erreur. Hourra!
Cependant, vous n'avez probablement pas simplement ajouté arbitrairement le nom_base, vous l'avez peut-être fait parce que vous avez défini un def personnalisé get_queryset () pour la Vue et donc Django vous oblige à ajouter le nom_base. Dans ce cas, vous devrez définir explicitement l '' url 'comme HyperlinkedIdentityField pour le sérialiseur en question. Notez que nous définissons ce HyperlinkedIdentityField SUR LE SERIALIZER de la vue qui génère l'erreur. Si mon erreur était "Impossible de résoudre l'URL de la relation hypertexte à l'aide du nom de vue" étude-détail ". Vous n'avez peut-être pas réussi à inclure le modèle associé dans votre API ou configuré de manière incorrecte l'
lookup_field
attribut dans ce champ." Je pourrais résoudre ce problème avec le code suivant.Mon ModelViewSet (le get_queryset personnalisé est la raison pour laquelle j'ai dû ajouter le nom_base au router.register () en premier lieu):
Mon enregistrement de routeur pour ce ModelViewSet dans urls.py:
ET VOICI O WH EST L'ARGENT! Ensuite, je pourrais le résoudre comme ceci:
Oui. Vous devez définir explicitement ce HyperlinkedIdentityField sur lui-même pour qu'il fonctionne. Et vous devez vous assurer que le
view_name
défini sur le HyperlinkedIdentityField est le même que celui que vous avez défini sur lebase_name
dans urls.py avec un '-detail' ajouté après.la source
<app_name>:studies-detail
. Par exemple mon si mon application est appeléetanks
, alors le chemin complet seraitHyperlinkedIdentityField(view_name="tanks:studies-detail")
. Pour comprendre cela, j'ai utilisé la commande django-exensionsshow_urls
, pour voir l'itinéraire complet et l'étiquette que le routeur faisait automatiquement.Ce code devrait également fonctionner.
la source
UserSerializer
doit être implémenté (il n'est pas prêt à importer), comme indiqué dans django-rest-framework.org/api-guide/serializersJ'ai rencontré cette erreur après avoir ajouté un espace de noms à mon URL
et en ajoutant app_name à mes urls.py
J'ai résolu ce problème en spécifiant NamespaceVersioning pour mon api de cadre de repos dans settings.py de mon projet
la source
Aujourd'hui, j'ai eu la même erreur et les changements ci-dessous me sauvent.
Changement
à:
la source
Même erreur, mais raison différente:
Je définis un modèle utilisateur personnalisé, rien de nouveau champ:
Ceci est ma fonction de vue:
Comme je n'ai pas cédé
queryset
directementUserViewSet
, je dois définir lebase_name
moment où j'enregistre cet ensemble de vues. C'est là que mon message d'erreur causé par leurls.py
fichier:Vous avez besoin du
base_name
même nom que votre modèle -customuser
.la source
Si vous étendez les classes GenericViewSet et ListModelMixin et que vous rencontrez la même erreur lors de l'ajout du champ url dans la vue de liste, c'est parce que vous ne définissez pas la vue de détail. Assurez-vous d'étendre le mixage RetrieveModelMixin :
la source
Il semble que
HyperlinkedModelSerializer
ne sont pas d'accord avec le fait d'avoir un cheminnamespace
. Dans ma candidature, j'ai apporté deux modifications.Dans le fichier URL importé
J'espère que cela t'aides.
la source
J'ai rencontré la même erreur en suivant le guide de démarrage rapide DRF http://www.django-rest-framework.org/tutorial/quickstart/ et en essayant de parcourir / users. J'ai fait cette configuration plusieurs fois auparavant sans problème.
Ma solution n'était pas dans le code mais dans le remplacement de la base de données.
La différence entre cette installation et les autres avant était lorsque j'ai créé la base de données locale.
Cette fois j'ai couru mon
immédiatement après avoir couru
Au lieu de l'ordre exact indiqué dans le guide.
Je soupçonnais que quelque chose n'était pas correctement créé dans la base de données. Je ne me souciais pas de ma base de données de développement, alors je l'ai supprimée et j'ai exécuté la
./manage.py migrate
commande une fois de plus, j'ai créé un super utilisateur, j'ai consulté / users et l'erreur a disparu.Quelque chose était problématique avec l'ordre des opérations dans lequel j'ai configuré DRF et la base de données.
Si vous utilisez sqlite et que vous êtes capable de tester le passage à une nouvelle base de données, cela vaut la peine d'essayer avant de disséquer tout votre code.
la source
Bouteille = sérialiseurs.PrimaryKeyRelatedField (read_only = True)
read_only vous permet de représenter le champ sans avoir à le lier à une autre vue du modèle.
la source
J'ai eu cette erreur sur DRF 3.7.7 lorsqu'une valeur de slug était vide (égale à '') dans la base de données.
la source
J'ai rencontré ce même problème et je l'ai résolu en l'ajoutant
generics.RetrieveAPIView
comme classe de base à mon ensemble de vues.la source
J'ai été coincé dans cette erreur pendant près de 2 heures:
ImproperlyConfigured at / api_users / users / 1 / Impossible de résoudre l'URL pour la relation hypertexte en utilisant le nom de vue "users-detail". Vous n'avez peut-être pas réussi à inclure le modèle associé dans votre API ou configuré incorrectement l'
lookup_field
attribut dans ce champ.Quand j'obtiens enfin la solution mais que je ne comprends pas pourquoi, mon code est donc:
mais dans mes URL principales, c'était:
Donc pour finalement résoudre le problème d'effacement de l'espace de noms:
Et je résous enfin mon problème, donc n'importe qui peut me dire pourquoi, mieux.
la source
Si vous omettez les champs «id» et «url» de votre sérialiseur, vous n'aurez aucun problème. Vous pouvez accéder aux publications en utilisant de toute façon l'id retourné dans l'objet json, ce qui facilite encore plus l'implémentation de votre frontend.
la source
J'ai eu le même problème, je pense que vous devriez vérifier votre
get_absolute_url
valeur d'entrée de la méthode du modèle objet (** kwargs) title. et utilisez le nom de champ exact dans lookup_field
la source