2016-11-23 6 views
3

Django Rest Frameworkを使用して同じオブジェクトに対して異なるビューセットを定義する際に問題が発生しています。以下は、DRFクイックスタートに基づいて、問題を再現するための最小限の例です。私はPython 3.5と最新のDRFを使用しています。Django Rest Framework同じオブジェクトに複数のビューセットとルータがある場合

チュートリアル/クイックスタート/ serializers.py

from django.contrib.auth.models import User 
from rest_framework import serializers 


class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('url', 'username', 'email') 

class UserMinimalSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('url', 'username') 

チュートリアル/クイックスタート/ views.py

from django.contrib.auth.models import User 
from rest_framework import viewsets 
from tutorial.quickstart.serializers import UserSerializer, UserMinimalSerializer 

class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all().order_by('-date_joined') 
    serializer_class = UserSerializer 


class UserMinimalViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all().order_by('-date_joined') 
    serializer_class = UserMinimalSerializer 

チュートリアル/ urls.py

.../users-minimal/
HTTP 200 OK 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    "users": "http://127.0.0.1:8000/users-minimal/", 
    "users-minimal": "http://127.0.0.1:8000/users-minimal/" 
} 

usersusers-minimalポイントの両方:サーバを実行してルートを取得するとき、あなたはで終わります。 http://HOST:PORT/users/にアクセスするとき

はまた、あなたが得る:

HTTP 200 OK 
Allow: GET, POST, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    "count": 2, 
    "next": null, 
    "previous": null, 
    "results": [ 
     { 
      "url": "http://127.0.0.1:8000/users-minimal/2/", 
      "username": "user2", 
      "email": "[email protected]" 
     }, 
     { 
      "url": "http://127.0.0.1:8000/users-minimal/1/", 
      "username": "user1, 
      "email": "[email protected]" 
     } 
    ] 
} 

注URLは.../users-minimal/を指します。

最後の質問:私の質問はthis oneと多少似ていますが、提案された解決策は私のためには機能しませんでした。

答えて

4

短い答え:あなたはusers-minimalにあなたのルートにbase_nameパラメータを追加する必要があります。

router = routers.DefaultRouter() 
router.register(r'users', UserViewSet) 
router.register(r'users-minimal', UserMinimalViewSet, base_name='usersminimal') 

通常DRFはあなたのクエリセットから自動的にbase_nameをgenereates。 ここでは、 "base_name"で説明しています。

2つのビューセットは同じクエリーセットを使用していますので、最初は同じbase_nameです。これは、あなたが見てきた問題につながります。後で登録されたViewSetは、登録済みのViewSetからのルートを上書きします。 この例では、router.registerの順番を変更すると、これが実際に表示されます。

あなたがシェルに直接コードをテストするときは、あなたのルートのベース名を見ることができます:

from rest_framework import routers 
from tutorial.quickstart import views 

router = routers.DefaultRouter() 
router.register(r'users', views.UserViewSet) 
router.register(r'users-minimal', views.UserMinimalViewSet) 


> routers.urls 
[<RegexURLPattern user-list ^minimal/$>, 
<RegexURLPattern user-list ^minimal\.(?P<format>[a-z0-9]+)/?$>, 
<RegexURLPattern user-detail ^minimal/(?P<pk>[^/.]+)/$>, 
<RegexURLPattern user-detail ^minimal/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$>, 
<RegexURLPattern user-list ^users/$>, 
<RegexURLPattern user-list ^users\.(?P<format>[a-z0-9]+)/?$>, 
<RegexURLPattern user-detail ^users/(?P<pk>[^/.]+)/$>, 
<RegexURLPattern user-detail ^users/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$>, 
<RegexURLPattern api-root ^$>, 
<RegexURLPattern api-root ^\.(?P<format>[a-z0-9]+)/?$>] 
関連する問題