【发布时间】:2018-02-13 16:30:10
【问题描述】:
我已尝试使用 Postman 删除单个 ManuscriptItem 实例,以针对以下视图执行我的 API 请求:
class ManuscriptViewSet(viewsets.ModelViewSet):
"""Handles creating, reading and updating items."""
authentication_classes = (TokenAuthentication,)
serializer_class = serializers.ManuscriptItemSerializer
permission_classes = (permissions.PostOwnManuscript, IsAuthenticated,)
def perform_create(self, serializer):
"""Sets the user profile to the logged in user."""
serializer.save(author=self.request.user)
def get_queryset(self):
"""
This view should return a list of all the manuscripts
for the currently authenticated user.
"""
user = self.request.user
return models.ManuscriptItem.objects.filter(author=user)
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance):
instance.delete()
destroy 和 perform destroy 函数是我尝试过的,但没有成功。这是我尝试时返回的内容:
{ "detail": "方法 \"DELETE\" 不允许。" }
这是我的网址当前的注册方式:
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))
]
我正在修改 ModelViewSet 错误,由于 ModelViewSet 的性质,我需要使用其他方法吗?当我使用授权用户删除 ManuscriptItem 实例时,我希望它可以在 Postman 上工作。在文档中说可以使用 Destroy() 方法。
其他信息
使用的网址是:
要从中删除的模型实例:
class ManuscriptItem(models.Model):
"""Represents a single manuscript's content"""
author = models.ForeignKey('accounts_api.UserProfile', on_delete=models.CASCADE)
title = models.CharField(max_length=255)
content = models.CharField(max_length=99999999)
def __str__(self):
"""Django uses when it needs to convert the object to a string"""
return str(self.id)
我尝试使用 json 在邮递员上发送删除请求的方式:
{ "manuscript": 7, }
结果:不允许删除方法
{ "id": 7, "author": 5, "title": "niceone", "content": "niceone" }
结果:不允许删除方法
其他问题/信息:
我不需要用 pk 指定路由器寄存器吗?我试过了,但也没有用:
router.register('manuscripts/{pk}/$', views.ManuscriptViewSet, base_name="manuscript_detail")
邮递员说:
允许 →GET、POST、HEAD、OPTIONS
【问题讨论】:
标签: django django-models django-rest-framework django-views