3

getまたは部分的な更新を実行しようとすると問題が発生するAPIエンドポイントがあります。私は何が紛失しているのか分からず、コードに試行錯誤を加えました。"detail"を返すDjango Rest Framework: "見つかりません"

エラー:

"detail": "Not found."

は、私の知る限り、URLを理解し、私は部分的に更新したいインスタンスのIDを含める必要があり、そうでPATCHを実行するためのURLは次のとおりです。

http://localhost:8000/manuscripts-api/manuscriptlibrary/9/

マイビュー:

class ManuscriptLibraryViewSet(viewsets.ModelViewSet): 
    """Handles creating, reading and updating manuscript library.""" 

    authentication_classes = (TokenAuthentication,) 
    serializer_class = serializers.ManuscriptLibrarySerializer 
    queryset = models.ManuscriptLibrary.objects.all() 
    permission_classes = (permissions.PostOwnManuscriptLibrary,) 

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

マイモデル:

class ManuscriptLibrary(models.Model): 
    """Represents a single manuscript's library""" 

    manuscript = models.OneToOneField(ManuscriptItem, on_delete=models.CASCADE) 
    bookmarks = models.CharField(max_length=99999999) 
    history = models.CharField(max_length=99999999) 

    def __str__(self): 
     """Django uses when it needs to convert the object to a string""" 
     return str(self.manuscript) 

マイシリアライザ:

class ManuscriptLibrarySerializer(serializers.ModelSerializer): 
    """A serializer for a manuscript's library.""" 

    class Meta: 
     model = models.ManuscriptLibrary 
     fields = ('id', 'manuscript', 'bookmarks', 'history') 

私のURL:

router = DefaultRouter() 
router.register('manuscripts', views.ManuscriptViewSet, base_name="manuscripts") # auto basename for models 
router.register('manuscriptlibrary', views.ManuscriptLibraryViewSet, base_name="manuscript_library") 
router.register('manuscriptsettings', views.ManuscriptSettingsViewSet) 

urlpatterns = [ 
    url(r'', include(router.urls)) 
] 

私の許可:

class PostOwnManuscriptLibrary(permissions.BasePermission): 
    """Allow author to update a manuscript's library they own.""" 

    def has_object_permission(self, request, view, obj): 
     if request.method in permissions.SAFE_METHODS: 
      return True 
     return obj.manuscript.author == request.user 

    def has_permission(self, request, view): 
     if request.method == 'POST': 
      manuscript = request.data.get('manuscript') 
      instance = ManuscriptItem.objects.get(pk=manuscript) 
      return instance.author == request.user 
     return True 

追加情報:

URL:

http://localhost:8000/manuscripts-api/manuscriptlibrary/

戻り値:パッチの

[ { "id": 28, "manuscript": 9, "bookmarks": "test success", "history": "test success" } ]

+1

これは、ユーザが権限 'PostOwnManuscriptLibrary'によって所有者ではないことが原因である可能性があります –

+0

メソッド更新のために私の許可を拡張する必要がありますかまたはパッチ? – NewScientists

+1

あなたはちょうどpkでURLに乗っていれば大丈夫です、あなたはオブジェクトシリアライザを見ますか? –

答えて

2

、あなたは、これは28で、あなたのケースで、idからの値を使用して、パスに移動してみてください、と

http://localhost:8000/manuscripts-api/manuscriptlibrary/28/ 
にパッチを適用する必要があり、詳細を取得します
+0

が見落とされてしまいました。おかげで再び@bearbrown – NewScientists

+0

ちょうど最後の質問。このパスは私がライブラリのIDを知っていることを前提としています。私のManuscriptItemモデル内で私はどのようにManuscriptLibraryに入り、ManuscriptLibraryインスタンスのIDを取得することができますか? – NewScientists