program story

Django Rest Framework-뷰 이름 "user-detail"을 사용하여 하이퍼 링크 된 관계에 대한 URL을 확인할 수 없습니다.

inputbox 2020. 9. 1. 07:29
반응형

Django Rest Framework-뷰 이름 "user-detail"을 사용하여 하이퍼 링크 된 관계에 대한 URL을 확인할 수 없습니다.


Django Rest Framework에서 사용자가 로그인하여 와인 저장고를 볼 수있는 프로젝트를 구축하고 있습니다. 내 ModelViewSets가 제대로 작동하고 갑자기이 실망스러운 오류가 발생합니다.

보기 이름 "user-detail"을 사용하여 하이퍼 링크 된 관계에 대한 URL을 확인할 수 없습니다. API에 관련 모델을 포함하지 못했거나이 lookup_field필드 에서 속성을 잘못 구성했을 수 있습니다.

트레이스 백은 다음을 보여줍니다.

    [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.

맞춤 이메일 사용자 모델이 있고 models.py의 병 모델은 다음과 같습니다.

class Bottle(models.Model):    
      wine = models.ForeignKey(Wine, null=False)
      user = models.ForeignKey(User, null=False, related_name='bottles')

내 시리얼 라이저 :

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')

내 의견 :

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

마지막으로 URL :

router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')

urlpatterns = patterns('',
    url(r'^', include(router.urls)),
    # ...

사용자 세부 정보보기가없고이 문제의 원인이 어디인지 알 수 없습니다. 어떤 아이디어?

감사


그것은 왜냐하면 HyperlinkedModelSerializer당신의 시리얼 라이저는 관련에 대한 URL 해결하려고 User온을 Bottle.
사용자 세부 정보보기가 없으므로이를 수행 할 수 없습니다. 따라서 예외입니다.

  1. UserViewSet라우터에을 등록하는 것만으로 문제가 해결되지 않습니까?
  2. URL을 확인하지 않고 BottleSerializer명시 적으로 사용 하도록 사용자 필드를 정의 할 수 UserSerializer있습니다. 그에 대한 중첩 된 개체를 처리하는 데 대한 serializer 문서를 참조하십시오 .

이 오류도 발생하여 다음과 같이 해결했습니다.

그 이유는 "**-detail"(view_name, 예 : user-detail) 네임 스페이스를 제공하는 것을 잊었 기 때문입니다. 따라서 Django Rest Framework는 해당 뷰를 찾을 수 없습니다.

내 프로젝트에 하나의 앱이 있으며 내 프로젝트 이름이 myproject이고 앱 이름이 myapp.

두 개의 urls.py 파일 myproject/urls.pymyapp/urls.py있습니다. 하나는 이고 다른 하나는 . 다음 myproject/urls.py과 같이 에서 앱에 네임 스페이스를 제공합니다 .

url(r'', include(myapp.urls, namespace="myapp")),

나머지 프레임 워크 라우터를에 등록한 후이 myapp/urls.py오류가 발생했습니다.

내 해결책은 URL에 네임 스페이스를 명시 적으로 제공하는 것입니다.

class UserSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="myapp:user-detail")

    class Meta:
        model = User
        fields = ('url', 'username')

그리고 그것은 내 문제를 해결했습니다.


어쩌면 누군가가 이것을 볼 수 있습니다 : http://www.django-rest-framework.org/api-guide/routers/

하이퍼 링크 된 serializer와 함께 네임 스페이스를 사용하는 경우 serializer의 view_name 매개 변수가 네임 스페이스를 올바르게 반영하는지 확인해야합니다. 예를 들면 :

urlpatterns = [
    url(r'^forgot-password/$', ForgotPasswordFormView.as_view()),
    url(r'^api/', include(router.urls, namespace='api')),
]

view_name='api:user-detail'사용자 세부 사항보기에 하이퍼 링크 된 직렬 변환기 필드 와 같은 매개 변수를 포함해야합니다 .

class UserSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="api:user-detail")

class Meta:
    model = User
    fields = ('url', 'username')

이 코드도 작동합니다.

class BottleSerializer(serializers.HyperlinkedModelSerializer):

  user = UserSerializer()

  class Meta:
    model = Bottle
    fields = ('url', 'wine', 'user')

이 오류를 일으키는 또 다른 불쾌한 실수는 urls.py에 불필요하게 base_name을 정의하는 것입니다. 예를 들면 :

router.register(r'{pathname}, views.{ViewName}ViewSet, base_name='pathname')

이로 인해 위에서 언급 한 오류가 발생합니다. 거기에서 base_name을 꺼내서 작동하는 API로 돌아갑니다. 아래 코드는 오류를 수정합니다. 만세!

router.register(r'{pathname}, views.{ViewName}ViewSet)

그러나 아마도 base_name을 임의로 추가하지 않았을 것입니다. View에 대한 사용자 정의 def get_queryset ()을 정의했기 때문에 Django에서 base_name을 추가하도록 요구했기 때문에 수행했을 수 있습니다. 이 경우 'url'을 해당 serializer에 대한 HyperlinkedIdentityField로 명시 적으로 정의해야합니다. 오류를 발생시키는 뷰의 SERIALIZER에서이 HyperlinkedIdentityField를 정의하고 있습니다. 내 오류가 "뷰 이름"study-detail "을 사용하여 하이퍼 링크 된 관계에 대한 URL을 확인할 수 없습니다. API에 관련 모델을 포함하지 못했거나이 lookup_field필드 속성을 잘못 구성했을 수 있습니다."인 경우 다음 코드로이 문제를 해결할 수 있습니다.

내 ModelViewSet (사용자 정의 get_queryset는 처음에 base_name을 router.register ()에 추가해야하는 이유입니다) :

class StudyViewSet(viewsets.ModelViewSet):
    serializer_class = StudySerializer

    '''custom get_queryset'''
    def get_queryset(self):
        queryset = Study.objects.all()
        return queryset

urls.py에서이 ModelViewSet에 대한 내 라우터 등록 :

router.register(r'studies', views.StudyViewSet, base_name='studies')

그리고 여기에 돈이 있습니다! 그런 다음 다음과 같이 해결할 수 있습니다.

class StudySerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="studies-detail")
    class Meta:
        model = Study
        fields = ('url', 'name', 'active', 'created',
              'time_zone', 'user', 'surveys')

네. 작동하려면이 HyperlinkedIdentityField 자체를 명시 적으로 정의해야합니다. 그리고 view_nameHyperlinkedIdentityField에 정의 된 내용이 base_name뒤에 '-detail'이 추가 된 urls.py 에 정의 된 것과 동일한 지 확인해야합니다.


동일한 오류이지만 다른 이유 :

사용자 지정 사용자 모델을 정의하고 새 필드는 없습니다.

from django.contrib.auth.models import (AbstractUser)
class CustomUser(AbstractUser):
    """
    custom user, reference below example
    https://github.com/jonathanchu/django-custom-user-example/blob/master/customuser/accounts/models.py

    # original User class has all I need
    # Just add __str__, not rewrite other field
    - id
    - username
    - password
    - email
    - is_active
    - date_joined
    - method, email_user
    """

    def __str__(self):
        return self.username

이것은 내보기 기능입니다.

from rest_framework import permissions
from rest_framework import viewsets
from .models import (CustomUser)
class UserViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.AllowAny,)
    serializer_class = UserSerializer

    def get_queryset(self):
        queryset = CustomUser.objects.filter(id=self.request.user.id)
        if self.request.user.is_superuser:
            queryset = CustomUser.objects.all()
        return queryset

queryset에서 직접 주지 않았기 때문에이 뷰셋을 등록 할 때 UserViewSet설정해야합니다 base_name. 이것은 urls.py파일로 인한 오류 메시지입니다 .

from myapp.views import (UserViewSet)
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'users', UserViewSet, base_name='customuser')  # <--base_name needs to be 'customuser' instead of 'user'

You need a base_name same as your model name - customuser.


If you're extending the GenericViewSet and ListModelMixin classes, and have the same error when adding the url field in the list view, it's because you're not defining the detail view. Be sure you're extending the RetrieveModelMixin mixin:

class UserViewSet (mixins.ListModelMixin,
                   mixins.RetrieveModelMixin,
                   viewsets.GenericViewSet):

I ran into the same error while I was following the DRF quickstart guide http://www.django-rest-framework.org/tutorial/quickstart/ and then attempting to browse to /users. I've done this setup many times before without problems.

My solution was not in the code but in replacing the database.

The difference between this install and the others before was when I created the local database.

This time I ran my

./manage.py migrate
./manage.py createsuperuser

immediately after running

virtualenv venv
. venv/bin/activate
pip install django
pip install djangorestframework

Instead of the exact order listed in the guide.

I suspected something wasn't properly created in the DB. I didn't care about my dev db so I deleted it and ran the ./manage.py migrate command once more, created a super user, browsed to /users and the error was gone.

Something was problematic with the order of operations in which I configured DRF and the db.

If you are using sqlite and are able to test changing to a fresh DB then it's worth an attempt before you go dissecting all of your code.


Bottle = serializers.PrimaryKeyRelatedField(read_only=True)

read_only allows you to represent the field without having to link it to another view of the model.


I got that error on DRF 3.7.7 when a slug value was empty (equals to '') in the database.


I ran into this same issue and resolved it by adding generics.RetrieveAPIView as a base class to my viewset.


I was stuck in this error for almost 2 hours:

ImproperlyConfigured at /api_users/users/1/ Could not resolve URL for hyperlinked relationship using view name "users-detail". You may have failed to include the related model in your API, or incorrectly configured the lookup_field attribute on this field.

When I finally get the solution but I don't understand why, so my code is:

#models.py
class Users(models.Model):
    id          = models.AutoField(primary_key=True)
    name        = models.CharField(max_length=50, blank=False, null=False)
    email       = models.EmailField(null=False, blank=False) 
    class Meta:
        verbose_name = "Usuario"
        verbose_name_plural = "Usuarios"

    def __str__(self):
        return str(self.name)


#serializers.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Users
        fields = (
            'id',
            'url',
            'name',        
            'email',       
            'description', 
            'active',      
            'age',         
            'some_date',   
            'timestamp',
            )
#views.py
class UserViewSet(viewsets.ModelViewSet):
    queryset = Users.objects.all()
    serializer_class = UserSerializer

#urls_api.py
router = routers.DefaultRouter()
router.register(r'users',UserViewSet, base_name='users')

urlpatterns = [ 
        url(r'^', include(router.urls)),
]

but in my main URLs, it was:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #api users
    url(r'^api_users/', include('usersApi.users_urls', namespace='api')),

]

So to finally I resolve the problem erasing namespace:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #api users
    url(r'^api_users/', include('usersApi.users_urls')),

]

And I finally resolve my problem, so any one can let me know why, bests.


If you omit the fields 'id' and 'url' from your serializer you won't have any problem. You can access to the posts by using the id that is returned in the json object anyways, which it makes it even easier to implement your frontend.


I had the same problem , I think you should check your

get_absolute_url

object model's method input value (**kwargs) title. and use exact field name in lookup_field


I ran into this error after adding namespace to my url

 url('api/v2/', include('api.urls', namespace='v2')),

and adding app_name to my urls.py

I resolved this by specifying NamespaceVersioning for my rest framework api in settings.py of my project

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.NamespaceVersioning'}

참고URL : https://stackoverflow.com/questions/20550598/django-rest-framework-could-not-resolve-url-for-hyperlinked-relationship-using

반응형