2017-09-05 104 views
3

我有一个API端点,当我尝试进行获取或部分更新时出现问题。我不确定我错过了什么,我已经将代码包含在尝试和错误中。Django Rest Framework返回“detail”:“未找到。”

错误:

"detail": "Not found."

据我明白的URL应该包括例如我想部分更新的ID,因此该URL来执行PATCH上是:

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') 

我的网址:

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 

附加信息:

网址:

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

返回:

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

+1

这可能是因为用户没有权限'PostOwnManuscriptLibrary' –

+0

我需要延长我的权限的方法更新所有者或补丁? – NewScientists

+1

当你只是确实得到与PK的URL是没事的,你看到的对象序列化? –

回答

2

补丁,让你需要从id使用值的细节,你的情况,这是28,试着去路径和补丁

http://localhost:8000/manuscripts-api/manuscriptlibrary/28/ 
+0

哇,这是一个忽视一个地狱。再次感谢@bearbrown – NewScientists

+0

只是最后一个问题。此路径假定我知道库的ID。我的ManuscriptItem模型中如何进入ManuscriptLibrary并获取ManuscriptLibrary实例的ID,它们只与外键相关? – NewScientists

相关问题