Estou construindo um projeto no Django Rest Framework onde os usuários podem fazer o login para visualizar sua adega. Meus ModelViewSets estavam funcionando bem e, de repente, recebo este erro frustrante:
Não foi possível resolver o URL para relacionamento com hiperlink usando o nome de exibição "detalhes do usuário". Você pode ter falhado ao incluir o modelo relacionado em sua API ou configurado incorretamente o
lookup_field
atributo neste campo.
O traceback mostra:
[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.
Eu tenho um modelo de usuário de e-mail personalizado e o modelo de garrafa em models.py é:
class Bottle(models.Model):
wine = models.ForeignKey(Wine, null=False)
user = models.ForeignKey(User, null=False, related_name='bottles')
Meus 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')
Minhas opiniões:
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
e finalmente o url:
router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')
urlpatterns = patterns('',
url(r'^', include(router.urls)),
# ...
Não tenho uma visualização de detalhes do usuário e não vejo de onde esse problema pode vir. Alguma ideia?
obrigado
fonte
Também encontrei este erro e resolvi-o da seguinte forma:
O motivo é que esqueci de dar a "** - detalhe" (view_name, por exemplo: detalhe do usuário) um namespace. Portanto, o Django Rest Framework não conseguiu encontrar essa visão.
Há um aplicativo em meu projeto, suponha que o nome do meu projeto seja
myproject
e o nome do aplicativo sejamyapp
.Existem dois arquivos urls.py, um é
myproject/urls.py
e o outro émyapp/urls.py
. Eu atribuo ao aplicativo um namespace emmyproject/urls.py
, assim como:Registrei os demais roteadores do framework
myapp/urls.py
e recebi este erro.Minha solução foi fornecer o url com o namespace explicitamente:
E resolveu meu problema.
fonte
extra_kwargs = {'url': {'view_name': 'myapp:user-detail'}}
Talvez alguém possa dar uma olhada nisso: http://www.django-rest-framework.org/api-guide/routers/
Se estiver usando namespacing com serializadores com hiperlink, você também precisará garantir que quaisquer parâmetros view_name nos serializadores reflitam corretamente o namespace. Por exemplo:
você precisaria incluir um parâmetro como
view_name='api:user-detail'
para campos do serializador com hiperlink para a visualização de detalhes do usuário.fonte
urls.py
foi duplamente aninhado em meunewsite
projeto: (1)newsite/urls.py
(criado por django) (2)polls/urls.py
(3)polls/api/v1/urls.py
............ Tenho que mencionar o nome aninhado usandourl = serializers.HyperlinkedIdentityField(view_name="polls:polls_api:user-detail")
Outro erro desagradável que causa esse erro é definir o base_name desnecessariamente no seu urls.py. Por exemplo:
Isso causará o erro observado acima. Tire esse base_name de lá e volte para uma API funcional. O código a seguir corrigirá o erro. Hooray!
No entanto, você provavelmente não adicionou apenas base_name arbitrariamente, você pode ter feito isso porque definiu um def get_queryset () personalizado para a Visualização e, portanto, o Django ordena que você adicione o base_name. Nesse caso, você precisará definir explicitamente o 'url' como um HyperlinkedIdentityField para o serializador em questão. Observe que estamos definindo este HyperlinkedIdentityField NO SERIALIZER da view que está gerando o erro. Se meu erro foi "Não foi possível resolver o URL para relacionamento com hiperlink usando o nome da visualização" detalhe do estudo ". Você pode ter falhado ao incluir o modelo relacionado em sua API ou configurado incorretamente o
lookup_field
atributo neste campo." Eu poderia consertar isso com o seguinte código.Meu ModelViewSet (o get_queryset personalizado é o motivo pelo qual tive que adicionar o base_name ao router.register () em primeiro lugar):
Meu registro de roteador para este ModelViewSet em urls.py:
E AQUI ESTÁ ONDE O DINHEIRO ESTÁ! Então eu poderia resolver assim:
Sim. Você deve definir explicitamente este HyperlinkedIdentityField em si mesmo para que funcione. E você precisa ter certeza de que o
view_name
definido em HyperlinkedIdentityField é o mesmo que você definiubase_name
em urls.py com um '-detail' adicionado depois dele.fonte
<app_name>:studies-detail
. Por exemplo, meu, se meu aplicativo for chamadotanks
, o caminho completo seráHyperlinkedIdentityField(view_name="tanks:studies-detail")
. Para descobrir isso, usei o comando django-exensionsshow_urls
, para ver a rota completa e o rótulo que o roteador estava fazendo automaticamente.Este código deve funcionar também.
fonte
UserSerializer
deve ser implementado (não está pronto para importar), conforme mostrado em django-rest-framework.org/api-guide/serializersEncontrei este erro depois de adicionar um namespace ao meu url
e adicionando app_name ao meu urls.py
Resolvi isso especificando NamespaceVersioning para minha API de estrutura restante em settings.py de meu projeto
fonte
Hoje, recebi o mesmo erro e as alterações abaixo me resgatam.
mudança
para:
fonte
Mesmo erro, mas motivo diferente:
Eu defino um modelo de usuário personalizado, nenhum campo novo:
Esta é a função da minha visão:
Como não cedi
queryset
diretamenteUserViewSet
, tenho que definirbase_name
quando registrar este conjunto de visualizações. É aqui que minha mensagem de erro causada porurls.py
arquivo:Você precisa do
base_name
mesmo nome do seu modelo -customuser
.fonte
Se você está estendendo as GenericViewSet e ListModelMixin aulas, e têm o mesmo erro ao adicionar o url campo na vista de lista, é porque você não está definindo a vista de detalhe. Certifique-se de estender o mixin RetrieveModelMixin :
fonte
Parece que
HyperlinkedModelSerializer
não concordo em ter um caminhonamespace
. Em meu aplicativo, fiz duas alterações.No arquivo de urls importado
Espero que isto ajude.
fonte
Encontrei o mesmo erro enquanto seguia o guia de início rápido do DRF http://www.django-rest-framework.org/tutorial/quickstart/ e, em seguida, tentava navegar para / users. Já fiz essa configuração muitas vezes antes, sem problemas.
Minha solução não estava no código, mas em substituir o banco de dados.
A diferença entre esta instalação e as outras anteriores foi quando criei o banco de dados local.
Desta vez eu corri meu
imediatamente depois de correr
Em vez da ordem exata listada no guia.
Suspeitei que algo não foi criado corretamente no DB. Não me importei com meu dev db, então o apaguei e executei o
./manage.py migrate
comando mais uma vez, criei um superusuário, naveguei até / users e o erro desapareceu.Algo estava problemático com a ordem de operações em que configurei o DRF e o db.
Se você estiver usando sqlite e for capaz de testar a mudança para um novo banco de dados, vale a pena tentar antes de dissecar todo o seu código.
fonte
Bottle = serializers.PrimaryKeyRelatedField (read_only = True)
read_only permite que você represente o campo sem ter que vinculá-lo a outra visualização do modelo.
fonte
Recebi aquele erro no DRF 3.7.7 quando um valor de slug estava vazio (igual a '') no banco de dados.
fonte
Eu encontrei esse mesmo problema e resolvi adicionando
generics.RetrieveAPIView
como uma classe base ao meu conjunto de visualizações.fonte
Fiquei preso neste erro por quase 2 horas:
ImproperlyConfigured at / api_users / users / 1 / Não foi possível resolver URL para relacionamento com hiperlink usando o nome de exibição "detalhes do usuário". Você pode ter falhado ao incluir o modelo relacionado em sua API ou configurado incorretamente o
lookup_field
atributo neste campo.Quando finalmente consigo a solução, mas não entendo o porquê, meu código é:
mas em meus URLs principais, era:
Então, para finalmente resolver o problema ao apagar o namespace:
E eu finalmente resolvo meu problema, para que qualquer um possa me dizer o porquê, melhor.
fonte
Se você omitir os campos 'id' e 'url' do serializador, não terá problemas. Você pode acessar as postagens usando o id que é retornado no objeto json de qualquer maneira, o que torna ainda mais fácil implementar seu frontend.
fonte
Eu tive o mesmo problema, acho que você deve verificar o seu
get_absolute_url
título do valor de entrada do método do modelo de objeto (** kwargs). e use o nome de campo exato em lookup_field
fonte