【发布时间】:2018-02-13 21:47:18
【问题描述】:
当我尝试进行获取或部分更新时,我有一个 API 端点出现问题。我不确定我错过了什么,我已经在尝试中包含了代码以及它给出的错误。
错误:
“详细信息”:“未找到。”
据我了解,url 应该包含我想要部分更新的实例的 ID,因此执行 PATCH 的 url 是:
我的看法:
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/
返回:
[ { “身份证”:28, “手稿”:9, “书签”:“测试成功”, “历史”:“测试成功” } ]
【问题讨论】:
-
可能是因为用户不是权限所有者
PostOwnManuscriptLibrary -
我需要为方法更新或补丁扩展我的权限吗?
-
当你用 pk 访问 url 就可以了,你会看到对象序列化器吗?
-
不,我的 GET 也有问题!我更新了我的问题以提及这一点。获取:localhost:8000/manuscripts-api/manuscriptlibrary/9。结果:“详细信息”:“未找到。”
-
为get
http://localhost:8000/manuscripts-api/manuscriptlibrary/添加输出
标签: django django-models django-rest-framework django-views