[解決済み] Django-Rest-Framework ルータ登録
2022-02-09 06:11:42
質問
Django-REST-FRAMEWORKを使って2台以上のルータを登録しようとすると、問題が発生するのですが。私の例をご覧ください。
urls.py
from rest_framework import routers
from collaborativeAPP import views
router = routers.DefaultRouter()
router.register(r'get_vocab', views.VocabViewSet)
router.register(r'get_term', views.TermViewSet)
router.register(r'get_discipline', views.DisciplineViewSet)
urlpatterns = patterns(
...
url(r'^service/', include(router.urls))
)
views.py
class VocabViewSet(viewsets.ModelViewSet):
queryset = Vocab.objects.all()
serializer_class = VocabSerializer
class TermViewSet(viewsets.ModelViewSet):
queryset = Term.objects.all()
serializer_class = TermSerializer
class DisciplineViewSet(viewsets.ModelViewSet):
queryset = Vocab.objects.filter(kwdGroup=4)
serializer_class = DisciplineSerializer
を実行した結果、私のローカルホストでは以下のようになりました。
http://localhost:8000/service/
HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS
{
"get_vocab": "http://127.0.0.1:8000/service/get_discipline/",
"get_term": "http://127.0.0.1:8000/service/get_term/",
"get_discipline": "http://127.0.0.1:8000/service/get_discipline/"
}
ご覧の通り、3つのルータを登録し、それぞれのメソッド名に対して3つのURLを表示することを想定しています(
get_vocab
,
get_term
,
get_discipline
). 最終的な結果は
get_discipline
が2回発生し、get_vocabのurlが欠落しています。
しかし、get_discipline と get_vocab の場合、同じモデルを使用しているため、このような混乱が発生します。それぞれのモデルに対してビューセットを使用すべきでしょうか?もしそうなら、どのようにビューセットで異なるメソッドを定義することができますか?
以下のような結果になるはずです。
HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS
{
"get_vocab": "http://127.0.0.1:8000/service/get_vocab/",
"get_term": "http://127.0.0.1:8000/service/get_term/",
"get_discipline": "http://127.0.0.1:8000/service/get_discipline/"
}
何が足りないのでしょうか?ルーターはいくつでも登録できると思っていたのですが。1つのモデルに1つのルーターがあるはずなのですが?同じモデルを共有するビューセットでは動作しないようですが?
解決方法は?
登録したビューセットに明示的にbase_nameを追加してみてください。
router = routers.DefaultRouter()
router.register(r'vocabs', views.VocabViewSet, 'vocabs')
router.register(r'terms', views.TermViewSet, 'terms')
router.register(r'disciplines', views.DisciplineViewSet, 'disciplines')
余談ですが
get_
という接頭辞はRESTfulではないため、URLの中に入れてください。各URLはリソースを指定すべきであり、リソースに対するアクションを指定するべきではありません。HTTP動詞はそのために使われるのです。
GET http://127.0.0.1:8000/service/vocabs/
# or this to create resource
POST http://127.0.0.1:8000/service/vocabs/
...
関連
-
[解決済み] djangoでDISTINCT個々の列を選択しますか?
-
[解決済み] Django-Rest-Framework ルータ登録
-
[解決済み] ImportError: rest_framework_jwt.viewsという名前のモジュールがありません。
-
[解決済み] Django manage.py ランサーバーが動作しない
-
[解決済み] djangoでモデルオブジェクトを一括作成する
-
[解決済み] SOAPとRESTの比較(相違点)
-
[解決済み] 検証失敗または重複が無効な場合のREST HTTPステータスコード
-
[解決済み】Djangoの管理者用URLをオブジェクトに取得する
-
[解決済み] Django REST Framework: ModelSerializerに追加フィールドを追加する
-
[解決済み] Django REST フレームワーク: 非モデルシリアライザー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] djangoでDISTINCT個々の列を選択しますか?
-
[解決済み] Django で django-storages と boto3 を使って CreateMultipartUpload オペレーションを呼び出すと AccessDenied になります。
-
[解決済み] django Forms のラジオボタン
-
[解決済み] CSRFに失敗しました。CSRFトークンがないか不正確です
-
[解決済み] CSRF 検証に失敗しました。リクエストは中断されました。
-
Django: OperationalError そのようなテーブルがない
-
django.db.utils.OperationalError の解決策です。(2003, "Can't connect to MySQL server") というエラーが発生します。
-
django queryset values&values_list
-
[解決済み] `SyntaxError: nonlocal 'topics_with_log_tag' のバインディングが見つからない` けど、バインディングはされている
-
[解決済み】DEBUG=Falseを設定すると、なぜdjangoの静的ファイルアクセスに失敗するのですか?