質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

1241閲覧

Django REST framework の APIのフィルタリングの書き方

sasaki0628

総合スコア106

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2022/10/31 08:29

クエリセットをフィルタリングして、リクエストを行っている現在認証されているユーザーに関連する結果のみをAPIとして作成したいのですが、どのように書けばよいでしょうか。

views.pyを以下のように書くと、NameError: name 'self' is not defined というエラーメッセージが出力されてしまいます。

from rest_framework import viewsets from .models import Accounts from .serializers import AccountsSerializer class AccountsViewSet(viewsets.ModelViewSet): serializer_class = AccountsSerializer user = self.request.user queryset = Accounts.objects.filter(user_id='user')

しかし、

from rest_framework import viewsets from .models import Accounts from .serializers import AccountsSerializer class AccountsViewSet(viewsets.ModelViewSet): serializer_class = AccountsSerializer def get_queryset(self): user = self.request.user return Accounts.objects.filter(user_id='user')

と記述してしまうと、urls.pyの書き方と合っていないようで、うまく修正できないでいます。

from django.urls import path, include from rest_framework import routers from . import views router = routers.DefaultRouter() router.register('userids', views.AccountsViewSet) app_name = 'apiAccounts' urlpatterns = [ path('', include(router.urls)), ]

エラーメッセージ

File "/usr/local/anaconda3/lib/python3.9/site-packages/rest_framework/routers.py", line 137, in get_default_basename assert queryset is not None, '`basename` argument not specified, and could ' \ AssertionError: `basename` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

調べたところ、同様の事象を発見しました。
https://stackoverflow.com/questions/29001493/how-do-you-override-a-modelviewsets-get-queryset-in-django-rest-framework-3

URLの回答に従い、以下のように修正をして完了しました。
views.py

from rest_framework import viewsets from .models import Accounts from .serializers import AccountsSerializer class AccountsViewSet(viewsets.ModelViewSet): serializer_class = AccountsSerializer permission_classes = [IsAuthenticated] def get_queryset(self): return Accounts.objects.filter(user_id=self.request.user)

urls.py

from django.urls import path, include from rest_framework import routers from . import views router = routers.DefaultRouter() router.register('accounts', views.AccountsViewSet,accounts-list) app_name = 'apiAccounts' urlpatterns = [ path('', include(router.urls)), ]

投稿2022/11/01 00:26

編集2022/11/01 00:30
sasaki0628

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問