Ich baue ein Projekt in Django Rest Framework auf, in dem sich Benutzer anmelden können, um ihren Weinkeller anzuzeigen. Meine ModelViewSets funktionierten einwandfrei und plötzlich erhalte ich diesen frustrierenden Fehler:
URL für Hyperlink-Beziehung mit Ansichtsname "Benutzerdetail" konnte nicht aufgelöst werden. Möglicherweise haben Sie das zugehörige Modell nicht in Ihre API aufgenommen oder das
lookup_field
Attribut in diesem Feld falsch konfiguriert .
Der Traceback zeigt:
[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.
Ich habe ein benutzerdefiniertes E-Mail-Benutzermodell und das Flaschenmodell in models.py lautet:
class Bottle(models.Model):
wine = models.ForeignKey(Wine, null=False)
user = models.ForeignKey(User, null=False, related_name='bottles')
Meine Serialisierer:
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')
Meine Ansichten:
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
und schließlich die URL:
router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')
urlpatterns = patterns('',
url(r'^', include(router.urls)),
# ...
Ich habe keine Benutzerdetailansicht und sehe nicht, woher dieses Problem kommen könnte. Irgendwelche Ideen?
Vielen Dank
quelle
Ich bin auch auf diesen Fehler gestoßen und habe ihn wie folgt gelöst:
Der Grund ist, dass ich vergessen habe, "** - detail" (Ansichtsname, zB: Benutzerdetail) einen Namespace zu geben. Daher konnte Django Rest Framework diese Ansicht nicht finden.
In meinem Projekt befindet sich eine App. Angenommen, mein Projektname lautet
myproject
und der App-Name lautetmyapp
.Es gibt zwei urls.py-Dateien, eine ist
myproject/urls.py
und die andere istmyapp/urls.py
. Ich gebe der App einen Namespacemyproject/urls.py
, genau wie:Ich habe die restlichen Framework-Router in registriert
myapp/urls.py
und dann diesen Fehler erhalten.Meine Lösung bestand darin, URL explizit mit einem Namespace zu versehen:
Und es hat mein Problem gelöst.
quelle
extra_kwargs = {'url': {'view_name': 'myapp:user-detail'}}
Vielleicht kann sich jemand das ansehen: http://www.django-rest-framework.org/api-guide/routers/
Wenn Sie den Namespace mit Hyperlink-Serialisierern verwenden, müssen Sie auch sicherstellen, dass alle view_name-Parameter auf den Serialisierern den Namespace korrekt wiedergeben. Beispielsweise:
Sie müssen einen Parameter einfügen, z. B.
view_name='api:user-detail'
für Serializer-Felder, die mit der Benutzerdetailansicht verlinkt sind.quelle
urls.py
wurde in meinemnewsite
Projekt doppelt verschachtelt : (1)newsite/urls.py
(erstellt von Django) (2)polls/urls.py
(3)polls/api/v1/urls.py
............ Ich muss den verschachtelten Namen miturl = serializers.HyperlinkedIdentityField(view_name="polls:polls_api:user-detail")
Ein weiterer böser Fehler, der diesen Fehler verursacht, besteht darin, dass der Basisname in Ihrer urls.py unnötig definiert ist. Beispielsweise:
Dies führt zu dem oben angegebenen Fehler. Holen Sie sich diesen Basisnamen heraus und kehren Sie zu einer funktionierenden API zurück. Der folgende Code würde den Fehler beheben. Hurra!
Wahrscheinlich haben Sie den Basisnamen jedoch nicht willkürlich hinzugefügt, sondern möglicherweise, weil Sie ein benutzerdefiniertes def get_queryset () für die Ansicht definiert haben und Django daher das Hinzufügen des Basisnamens vorschreibt. In diesem Fall müssen Sie die 'URL' explizit als HyperlinkedIdentityField für den betreffenden Serializer definieren. Beachten Sie, dass wir dieses HyperlinkedIdentityField auf dem SERIALIZER der Ansicht definieren, die den Fehler auslöst. Wenn mein Fehler lautete: "URL für Hyperlink-Beziehung mit Ansichtsname" Studiendetail "konnte nicht aufgelöst werden. Möglicherweise haben Sie das zugehörige Modell nicht in Ihre API aufgenommen oder das
lookup_field
Attribut in diesem Feld falsch konfiguriert ." Ich könnte dies mit dem folgenden Code beheben.Mein ModelViewSet (das benutzerdefinierte get_queryset ist der Grund, warum ich den base_name zuerst zum router.register () hinzufügen musste):
Meine Router-Registrierung für dieses ModelViewSet in urls.py:
UND HIER IST DAS GELD! Dann könnte ich es so lösen:
Ja. Sie müssen dieses HyperlinkedIdentityField explizit für sich selbst definieren, damit es funktioniert. Und Sie müssen sicherstellen, dass das
view_name
im HyperlinkedIdentityField definiertebase_name
Element mit dem in der in urls.py definierten übereinstimmt, gefolgt von einem '-detail'.quelle
<app_name>:studies-detail
. Wenn zum Beispiel meine App aufgerufen wirdtanks
, ist der vollständige PfadHyperlinkedIdentityField(view_name="tanks:studies-detail")
. Um das herauszufinden, habe ich den Befehl django-exensions verwendetshow_urls
, um die vollständige Route und die Bezeichnung zu sehen, die der Router automatisch erstellt hat.Dieser Code sollte auch funktionieren.
quelle
UserSerializer
Es ist erwähnenswertIch bin auf diesen Fehler gestoßen, nachdem ich meiner URL einen Namespace hinzugefügt habe
und Hinzufügen von app_name zu meiner urls.py
Ich habe dieses Problem behoben, indem ich NamespaceVersioning für meine Rest-Framework-API in settings.py meines Projekts angegeben habe
quelle
Heute habe ich den gleichen Fehler bekommen und die folgenden Änderungen retten mich.
Veränderung
zu:
quelle
Gleicher Fehler, aber anderer Grund:
Ich definiere ein benutzerdefiniertes Benutzermodell, nichts neues Feld:
Dies ist meine Ansichtsfunktion:
Da ich nicht
queryset
direkt nachgegeben habeUserViewSet
, muss ich festlegen,base_name
wann ich dieses Viewset registriere. Hier ist meine Fehlermeldung durchurls.py
Datei verursacht :Sie benötigen das
base_name
gleiche wie Ihr Modellname -customuser
.quelle
Wenn Sie die Klassen GenericViewSet und ListModelMixin erweitern und beim Hinzufügen der Klassen den gleichen Fehler haben URL- Felds in der , liegt dies daran, dass Sie die Detailansicht nicht definieren. Stellen Sie sicher, dass Sie das RetrieveModelMixin- Mixin erweitern:
quelle
Es scheint, dass
HyperlinkedModelSerializer
nicht mit einem Pfad einverstanden sindnamespace
. In meiner Bewerbung habe ich zwei Änderungen vorgenommen.In der importierten URL-Datei
Hoffe das hilft.
quelle
Ich bin auf denselben Fehler gestoßen, als ich der DRF-Kurzanleitung http://www.django-rest-framework.org/tutorial/quickstart/ gefolgt bin und dann versucht habe, zu / users zu navigieren . Ich habe dieses Setup schon oft ohne Probleme durchgeführt.
Meine Lösung bestand nicht im Code, sondern im Ersetzen der Datenbank.
Der Unterschied zwischen dieser Installation und den anderen zuvor bestand darin, dass ich die lokale Datenbank erstellt habe.
Diesmal lief ich meine
sofort nach dem Laufen
Anstelle der genauen Reihenfolge in der Anleitung aufgeführt.
Ich vermutete, dass etwas in der Datenbank nicht richtig erstellt wurde. Ich habe mich nicht um meine Entwickler-Datenbank gekümmert, also habe ich sie gelöscht und die ausgeführt
./manage.py migrate
Befehl erneut ausgeführt, einen Superuser erstellt, zu / users navigiert und der Fehler war verschwunden.Etwas war problematisch mit der Reihenfolge der Operationen, in denen ich DRF und die Datenbank konfiguriert habe.
Wenn Sie SQLite verwenden und den Wechsel zu einer neuen Datenbank testen können, ist es einen Versuch wert, bevor Sie Ihren gesamten Code zerlegen.
quelle
Bottle = serializers.PrimaryKeyRelatedField (read_only = True)
Mit read_only können Sie das Feld darstellen, ohne es mit einer anderen Ansicht des Modells verknüpfen zu müssen.
quelle
Ich habe diesen Fehler in DRF 3.7.7 erhalten, als ein Slug-Wert in der Datenbank leer war (gleich '').
quelle
Ich bin auf dasselbe Problem
generics.RetrieveAPIView
gestoßen und habe es behoben, indem ich meinem Viewset eine Basisklasse hinzugefügt habe.quelle
Ich war fast 2 Stunden in diesem Fehler gefangen:
Unsachgemäß konfiguriert unter / api_users / users / 1 / URL für Hyperlink-Beziehung mit Ansichtsname "Benutzerdetail" konnte nicht aufgelöst werden. Möglicherweise haben Sie das zugehörige Modell nicht in Ihre API aufgenommen oder das
lookup_field
Attribut in diesem Feld falsch konfiguriert .Wenn ich endlich die Lösung bekomme, aber nicht verstehe warum, lautet mein Code:
aber in meinen Haupt-URLs war es:
Um das Problem beim Löschen des Namespace endgültig zu lösen:
Und ich löse endlich mein Problem, so dass jeder mich wissen lassen kann, warum, am besten.
quelle
Wenn Sie die Felder 'id' und 'url' in Ihrem Serializer weglassen, haben Sie kein Problem. Sie können auf die Beiträge zugreifen, indem Sie die ID verwenden, die sowieso im json-Objekt zurückgegeben wird, was die Implementierung Ihres Frontends noch einfacher macht.
quelle
Ich hatte das gleiche Problem, ich denke, Sie sollten Ihre überprüfen
get_absolute_url
Titel des Methodeneingabewerts (** kwargs) des Objektmodells. und verwenden Sie den genauen Feldnamen in lookup_field
quelle