gpt4 book ai didi

django - Django Rest Framework ModelViewSet 上的删除方法

转载 作者:行者123 更新时间:2023-12-04 11:10:03 24 4
gpt4 key购买 nike

我尝试使用 Postman 删除单个 ManuscriptItem 实例以针对以下 View 执行我的 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 和执行销毁功能是我尝试但没有成功的功能。这是我尝试时返回的内容:

{ "detail": "Method \"DELETE\" not allowed." }



这是我的 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))
]

我修改 ModelViewSet 是错误的,由于 ModelViewSet 的性质,我是否需要使用另一种方法?当我使用授权用户删除 ManuscriptItem 实例时,我希望它可以在 Postman 上工作。在文档中它说可以使用 Destroy() 方法。

附加信息

使用的网址是:

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



要删除的模型实例:
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 向 postman 发送删除请求的方式:

{
"manuscript": 7,
}


结果:不允许删除方法

{
"id": 7,
"author": 5,
"title": "niceone",
"content": "niceone"
}


结果:不允许删除方法

其他问题/信息:

我不需要用pk指定路由器寄存器吗?我试过这个,但也没有用:
router.register('manuscripts/{pk}/$', views.ManuscriptViewSet, base_name="manuscript_detail")

postman 说:

Allow →GET, POST, HEAD, OPTIONS

最佳答案

这里的问题是您发送 DELETE请求错误的网址。看 DefaultRouter docs .它会在您的 viewset 中自动生成您的网址:

DefaultRouter class url patterns

仔细看 DELETE方法。它在 {prefix}/{lookup}/[.format]网址模式。这意味着你对应的路由器 url 是 manuscripts/<manuscript_id>/ ,但您尝试发送 DELETE请求到 manuscripts/只是,这是上面的模式。您可以直接从表中看到允许的 HTTP 方法有 GETPOST只要。这就是为什么您会收到 MethodNotAllowed .

解决您的问题的方法不是通过 manuscript_id作为请求的 JSON 正文

{
"manuscript": 7,
}

但是要将其直接传递给 url:

DELETE http://localhost:8000/manuscripts-api/manuscripts/7/



您只需注册您的 View 集,如:
router.register(r'manuscripts', ManuscriptViewSet.as_view(), name='manuscripts')

如您所见, DRF 为您自动生成网址。

关于django - Django Rest Framework ModelViewSet 上的删除方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46053922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com