こんにちはこのリクエストを行うとき: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()),
]
何か助けはありますか?
まず、get_queryset()
メソッドでクエリセットを返す必要があります。
また、lookup_url_kwarg
をuuid
として誤って定義しました。このurlkwarg
値は、get_queryset()
メソッドから返されたクエリセットでuuid
user_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
フィールドでこの返されたクエリセットのルックアップを実行しようとしました。そのクエリセットにはそのようなオブジェクトが存在しないため、そのエラーが返されました。
通常、このエラーは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'
}
追加したかっただけです。私が見ていた場合、queryset
は期待されるオブジェクトを含むクエリセットを返していなかったので、あなたの質問に対する変更はどのように見えるかという点で:
class MemberDetail(generics.GenericAPIView):
serializer_class = GroupMembersSerializer
queryset = GroupMember.objects.filter(...)
に変更されました:
queryset = GroupMember.objects.all()