[python] 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')


답변

이 오류를 일으키는 또 다른 불쾌한 실수는 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에서 정의한 것과 동일한 지 확인해야합니다.


답변

이 코드도 작동합니다.

class BottleSerializer(serializers.HyperlinkedModelSerializer):

  user = UserSerializer()

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


답변

내 URL에 네임 스페이스를 추가 한 후이 오류가 발생했습니다.

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

내 urls.py에 app_name 추가

내 프로젝트의 settings.py에서 나머지 프레임 워크 API에 대해 NamespaceVersioning을 지정하여이 문제를 해결했습니다.

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


답변

오늘 나는 같은 오류가 발생했으며 아래 변경 사항이 나를 구해줍니다.

변화

class BottleSerializer(serializers.HyperlinkedModelSerializer):

에:

 class BottleSerializer(serializers.ModelSerializer):