Buduję projekt w Django Rest Framework, w którym użytkownicy mogą się zalogować, aby zobaczyć swoją piwnicę z winami. Moje zestawy ModelViewSets działały dobrze i nagle pojawia się ten frustrujący błąd:
Nie można rozwiązać adresu URL relacji hiperłącza przy użyciu nazwy widoku „szczegóły użytkownika”. Być może nie udało się uwzględnić powiązanego modelu w interfejsie API lub nieprawidłowo skonfigurowano
lookup_field
atrybut w tym polu.
Dane śledzenia pokazują:
[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.
Mam niestandardowy model użytkownika poczty e-mail, a model butelki w models.py to:
class Bottle(models.Model):
wine = models.ForeignKey(Wine, null=False)
user = models.ForeignKey(User, null=False, related_name='bottles')
Moje serializatory:
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')
Moje poglądy:
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
i na końcu adres URL:
router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')
urlpatterns = patterns('',
url(r'^', include(router.urls)),
# ...
Nie mam widoku szczegółów użytkownika i nie wiem, skąd może pochodzić ten problem. Jakieś pomysły?
Dzięki
źródło
Natknąłem się również na ten błąd i rozwiązałem go w następujący sposób:
Powodem jest to, że zapomniałem nadać "** - detail" (nazwa_widoku, np .: szczegóły użytkownika) przestrzeni nazw. Tak więc Django Rest Framework nie mógł znaleźć tego widoku.
W moim projekcie jest jedna aplikacja, przypuśćmy, że nazwa mojego projektu to
myproject
, a nazwa aplikacji tomyapp
.Istnieją dwa pliki urls.py, jeden to,
myproject/urls.py
a drugi tomyapp/urls.py
. Daję aplikacji przestrzeń nazw wmyproject/urls.py
, tak jak:Zarejestrowałem pozostałe routery szkieletowe w
myapp/urls.py
, a następnie otrzymałem ten błąd.Moim rozwiązaniem było jawne podanie adresu URL z przestrzenią nazw:
I to rozwiązało mój problem.
źródło
extra_kwargs = {'url': {'view_name': 'myapp:user-detail'}}
Może ktoś mógłby rzucić okiem na to: http://www.django-rest-framework.org/api-guide/routers/
Jeśli używasz przestrzeni nazw z serializatorami z hiperłączami, musisz również upewnić się, że wszystkie parametry view_name w serializatorach poprawnie odzwierciedlają przestrzeń nazw. Na przykład:
należałoby dołączyć parametr, taki jak
view_name='api:user-detail'
pola serializatora, które są połączone hiperłączem z widokiem szczegółów użytkownika.źródło
urls.py
był podwójnie zagnieżdżone w moimnewsite
projekcie: (1)newsite/urls.py
(stworzony przez Django) (2)polls/urls.py
(3)polls/api/v1/urls.py
............ muszę wspomnieć zagnieżdżony nazwę zaurl = serializers.HyperlinkedIdentityField(view_name="polls:polls_api:user-detail")
Innym paskudnym błędem, który powoduje ten błąd, jest niepotrzebne zdefiniowanie nazwy base_name w twoim urls.py. Na przykład:
Spowoduje to błąd opisany powyżej. Pobierz tę nazwę base_name i wróć do działającego API. Poniższy kod naprawiłby błąd. Brawo!
Jednak prawdopodobnie nie dodałeś arbitralnie nazwy base_name, mogłeś to zrobić, ponieważ zdefiniowałeś niestandardową def get_queryset () dla widoku, a więc Django nakazuje dodanie nazwy base_name. W takim przypadku musisz jawnie zdefiniować „url” jako HyperlinkedIdentityField dla danego serializatora. Zauważ, że definiujemy to HyperlinkedIdentityField NA SERIALIZATORZE widoku, który zgłasza błąd. Jeśli mój błąd to „Nie można rozwiązać adresu URL relacji hiperłącza przy użyciu nazwy widoku„ szczegóły badania ”. Możliwe, że nie udało się uwzględnić powiązanego modelu w interfejsie API lub nieprawidłowo skonfigurowano
lookup_field
atrybut w tym polu.” Mogę to naprawić za pomocą następującego kodu.Mój ModelViewSet (niestandardowy get_queryset jest powodem, dla którego musiałem dodać base_name do router.register () w pierwszej kolejności):
Rejestracja mojego routera dla tego ModelViewSet w urls.py:
I TU GDZIE SĄ PIENIĄDZE! Wtedy mógłbym rozwiązać to tak:
Tak. Musisz jawnie zdefiniować ten HyperlinkedIdentityField w sobie, aby działał. I musisz się upewnić, że
view_name
zdefiniowane w HyperlinkedIdentityField jest takie samo, jak zdefiniowanebase_name
w urls.py z dodanym po nim „-detail”.źródło
<app_name>:studies-detail
. Na przykład my, jeśli wywoływana jest moja aplikacjatanks
, pełna ścieżka będzie wyglądać takHyperlinkedIdentityField(view_name="tanks:studies-detail")
. Aby to zrozumieć, użyłemshow_urls
polecenia django-exensions , aby zobaczyć pełną trasę i etykietę, którą router automatycznie tworzył.Ten kod też powinien działać.
źródło
UserSerializer
musi zostać zaimplementowane (nie jest gotowe do importu), jak pokazano w django-rest-framework.org/api-guide/serializersWystąpił ten błąd po dodaniu przestrzeni nazw do mojego adresu URL
i dodając app_name do mojego urls.py
Rozwiązałem to, określając NamespaceVersioning dla mojego interfejsu API reszty w settings.py mojego projektu
źródło
Dzisiaj mam ten sam błąd i poniższe zmiany mnie ratują.
Zmiana
do:
źródło
Ten sam błąd, ale inny powód:
Definiuję niestandardowy model użytkownika, nic nowego:
To jest moja funkcja widoku:
Ponieważ nie poddałem się
queryset
bezpośrednioUserViewSet
, muszę ustawić,base_name
kiedy rejestruję ten zestaw widoków. Oto, gdzie mój komunikat o błędzie spowodowany przezurls.py
plik:Potrzebujesz tego
base_name
samego, co nazwa twojego modelu -customuser
.źródło
Jeśli rozszerzasz klasy GenericViewSet i ListModelMixin i masz ten sam błąd podczas dodawania pola adresu URL w widoku listy, dzieje się tak, ponieważ nie definiujesz widoku szczegółów. Upewnij się, że rozszerzasz składnię RetrieveModelMixin :
źródło
Wydaje się, że
HyperlinkedModelSerializer
nie zgadzają się na posiadanie ścieżkinamespace
. W mojej aplikacji dokonałem dwóch zmian.W zaimportowanym pliku adresów URL
Mam nadzieję że to pomoże.
źródło
Napotkałem ten sam błąd, gdy korzystałem z przewodnika szybkiego startu DRF http://www.django-rest-framework.org/tutorial/quickstart/, a następnie próbowałem przejść do katalogu / users. Robiłem tę konfigurację wiele razy bez problemów.
Moje rozwiązanie nie było w kodzie, ale w zastąpieniu bazy danych.
Różnica między tą instalacją a innymi wcześniejszymi polegała na utworzeniu lokalnej bazy danych.
Tym razem uruchomiłem mój
natychmiast po uruchomieniu
Zamiast dokładnej kolejności podanej w przewodniku.
Podejrzewałem, że coś nie zostało poprawnie utworzone w DB. Nie przejmowałem się moją bazą deweloperską, więc usunąłem ją i uruchomiłem
./manage.py migrate
polecenie jeszcze raz, utworzyłem superużytkownika, przeszukałem do / users i błąd zniknął.Coś było problematyczne z kolejnością operacji, w których skonfigurowałem DRF i db.
Jeśli używasz sqlite i jesteś w stanie przetestować zmianę na świeżą bazę danych, warto spróbować, zanim przejdziesz do sekcji całego kodu.
źródło
Bottle = serializers.PrimaryKeyRelatedField (read_only = True)
read_only pozwala na reprezentowanie pola bez konieczności łączenia go z innym widokiem modelu.
źródło
Otrzymałem ten błąd w DRF 3.7.7, gdy wartość slug była pusta (równa się „”) w bazie danych.
źródło
generics.RetrieveAPIView
Napotkałem ten sam problem i rozwiązałem go, dodając jako klasę bazową do mojego zestawu widoków.źródło
Utknąłem w tym błędzie przez prawie 2 godziny:
Nieprawidłowo skonfigurowany w / api_users / users / 1 / nie można rozpoznać adresu URL dla relacji hiperłącza przy użyciu nazwy widoku „szczegóły-użytkowników”. Być może nie udało się uwzględnić powiązanego modelu w interfejsie API lub nieprawidłowo skonfigurowano plik
lookup_field
atrybut w tym polu.Kiedy w końcu dostaję rozwiązanie, ale nie rozumiem dlaczego, więc mój kod to:
ale w moich głównych adresach URL było to:
Aby w końcu rozwiązać problem kasowania przestrzeni nazw:
I w końcu rozwiązuję swój problem, więc każdy może dać mi znać, dlaczego.
źródło
Jeśli pominiesz pola „id” i „url” w swoim serializatorze, nie będziesz miał żadnego problemu. Możesz uzyskać dostęp do postów za pomocą identyfikatora, który i tak jest zwracany w obiekcie json, co sprawia, że implementacja interfejsu użytkownika jest jeszcze łatwiejsza.
źródło
Miałem ten sam problem, myślę, że powinieneś sprawdzić
get_absolute_url
wartość wejściowa metody modelu obiektowego (** kwargs) title. i użyj dokładnej nazwy pola w lookup_field
źródło