1. ホーム
  2. python

[解決済み] Django Rest Framework - ビュー名 "user-detail" を使用したハイパーリンク関係の URL を解決できなかった。

2022-02-18 19:03:37

質問

私は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 シリアライザは、関連する User を使用します。 Bottle .
ユーザー詳細画面がないため、このようなことはできません。そのため、例外が発生します。

  1. を登録するだけではダメなのでしょうか? UserViewSet をルーターに接続することで、問題を解決できますか?
  2. にユーザーフィールドを定義することができます。 BottleSerializer を明示的に使用するようにします。 UserSerializer を解決しようとするのではなく、URL を解決しようとします。を参照してください。 シリアライザーのドキュメントでは、ネストされたオブジェクトの処理について説明しています。 .