web-dev-qa-db-ja.com

Django Rest Framework- "詳細": "見つかりません。"

こんにちはこのリクエストを行うとき:groups/25010a31-fc5b-47c8-9c5c-d740e5743f52/members/4 /-「詳細」を取得します:「見つかりません」

ただし、クエリセットを見ると、Groupmemberインスタンスが出力されており、その特定のインスタンスが非常に明確に印刷されているのでしょうか。

見る:

class MemberDetail(mixins.RetrieveModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.UpdateModelMixin,
                   generics.GenericAPIView):
    serializer_class = GroupMembersSerializer
    lookup_field = "user_id"
    lookup_url_kwarg = "uuid"

    def get_queryset(self):
        group = self.kwargs["uuid"]
        user_id = self.kwargs["user_id"]
        print GroupMember.objects.get(group = group, user_id = user_id)
        return GroupMember.objects.get(group = group, user_id = user_id)

    def get(self, request, *args, **kwargs):
        return self.retrieve(self, request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(self, request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(self, request, *args, **kwargs)

uRL:

 urlpatterns = [

    url(r'^$', views.GroupList.as_view()),
    url(r'^(?P<uuid>[^/]+)/$', views.GroupDetail.as_view()),
    url(r'^(?P<uuid>[^/]+)/members/$', views.MemberList.as_view()),
    url(r'^(?P<uuid>[^/]+)/members/(?P<user_id>[0-9]+)/$', views.MemberDetail.as_view()),

] 

何か助けはありますか?

15
Danny

まず、get_queryset()メソッドでクエリセットを返す必要があります。

また、lookup_url_kwarguuidとして誤って定義しました。このurlkwarg値は、get_queryset()メソッドから返されたクエリセットでuuiduser_idのルックアップを実行するために使用されるため、実際にはlookup_fieldである必要があります。

未設定の場合のlookup_url_kwargのデフォルト値はlookup_fieldと同じ値です。したがって、lookup_url_kwargを定義する必要はありません。 lookup_fieldから計算されます。

class MemberDetail(mixins.RetrieveModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.UpdateModelMixin,
                   generics.GenericAPIView):
    serializer_class = GroupMembersSerializer
    lookup_field = "user_id" # no need to define 'lookup_url_kwarg' as both have same value

    def get_queryset(self):
        group = self.kwargs["uuid"]
        return GroupMember.objects.filter(group = group) # return a queryset

get_queryset()メソッドでは、groupリクエストがあるたびにDRF自体によって実行されるためuser_idではなくretrieveを使用してフィルタリングします。

クエリセットで.get()を使用すると、クエリセットではなくオブジェクトが返されます。 lookup_fieldの値に基づいてフィルタリングを実行するには、クエリセットが必要です。さて、.filter()はクエリセットを返すので、ここでそれを使用しました。

注:GroupMember.objects.filter(group = group, user_id = user_id)を返すと、retrieveは、値をuser_id値、つまりlookup_url_kwargとして、user_id=25010a31-fc5b-47c8-9c5c-d740e5743f52フィールドでこの返されたクエリセットのルックアップを実行しようとしました。そのクエリセットにはそのようなオブジェクトが存在しないため、そのエラーが返されました。

12
Rahul Gupta

通常、このエラーはDjango RestFrameworkデータテーブルをインストールしたときに表示されます。設定でRestFrameworkの構成の次の値を確認してください。

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
        'rest_framework_datatables.renderers.DatatablesRenderer',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework_datatables.filters.DatatablesFilterBackend',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework_datatables.pagination.DatatablesPageNumberPagination',
    'PAGE_SIZE': 50,
    'EXCEPTION_HANDLER': 'utils.rest_framework.views.exception_handler'
}
2
direyes

追加したかっただけです。私が見ていた場合、querysetは期待されるオブジェクトを含むクエリセットを返していなかったので、あなたの質問に対する変更はどのように見えるかという点で:

class MemberDetail(generics.GenericAPIView):
    serializer_class = GroupMembersSerializer
    queryset = GroupMember.objects.filter(...)

に変更されました:

queryset = GroupMember.objects.all()
0
jmunsch