Django Rest Framework ModelViewSet上的Delete方法 [英] Delete method on Django Rest Framework ModelViewSet
问题描述
我尝试使用Postman删除单个ManuscriptItem实例,以针对以下视图执行我的API请求:
class ManuscriptViewSet(viewsets.ModelViewSet):
处理创建,读取和更新项目。
authentication_classes =(TokenAuthentication,)
serializer_class = serializers.ManuscriptItemSerializer
Permission_classes =(permissions.PostOwnManuscript,IsAuthenticated,)
def perform_create(self,serializer):
将用户配置文件设置为已登录的用户。
serializer.save(author = self.request.user)
def get_queryset(self):
此视图应返回所有手稿的列表
当前验证的用户。
用户= self.request.user
返回模型.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(自身,实例) :
instance.delete()
销毁和执行销毁功能是我尝试过的没有成功。这是我尝试时返回的内容:
{
detail: Method \ DELETE\不是允许的。 }
这是我当前注册URL的方式:
router = DefaultRouter()
router.register('manuscripts',views.ManuscriptViewSet,base_name = manuscripts)#模型的自动基本名
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()方法。
其他信息
使用的URL是:
仔细查看
Delete
方法。它位于{prefix} / {lookup} / [。format]
网址格式中。这意味着您对应的路由器URL是manuscripts /< manuscript_id> /
,但是您尝试将DELETE
请求发送到手稿/
,即上述模式。您可以从表中直接看到允许的HTTP方法只有GET
和POST
。这就是为什么您收到MethodNotAllowed
的原因。
解决问题的方法是不通过
manuscript_id
作为请求的JSON正文{
手稿:7,
}
但直接将其传递给url:
Delete
http:// localhost:8000 / manuscripts-api / manuscripts / 7 /
您只需注册您的视图集,例如:
router.register(r'manuscripts',ManuscriptViewSet.as_view(),name =' ')
如您所见, DRF 会自动为您生成网址
i have tried to delete a single ManuscriptItem instance using Postman to perform my API requests on against the view below:
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()
The destroy and perform destroy functions are what I have attempted without success. This is what it returns when i tried:
{ "detail": "Method \"DELETE\" not allowed." }
This is how my URLs are currently registered:
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)) ]
I'm i modifying the ModelViewSet wrong do i need to use another approach because of the nature of ModelViewSet? i expected it to work on Postman when i used an Authorized user to Delete a ManuscriptItem instance. In the docs it said Destroy() method can be used.
Additional information
The URL used is:
The model instance to be deleted from:
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)
The way i have tried sending delete requests on postman with json:
{ "manuscript": 7, }
Results: Delete Method not allowed
{ "id": 7, "author": 5, "title": "niceone", "content": "niceone" }
Results: Delete Method not allowed
Additional Questions/Info:
Don't i need to specify the router register with a pk? I tried this but didnt work either:
router.register('manuscripts/{pk}/$', views.ManuscriptViewSet, base_name="manuscript_detail")
Postman says:
Allow →GET, POST, HEAD, OPTIONS
解决方案The issue here is that you send
DELETE
request to the wrong url. Look at theDefaultRouter
docs. It generates automatically your urls within yourviewset
:Look closely at the
DELETE
method. It is on the{prefix}/{lookup}/[.format]
url pattern. This means that your corresponding router url ismanuscripts/<manuscript_id>/
, but you try to sendDELETE
request tomanuscripts/
only, which is the above pattern. You see directly from the table that the allowed HTTP methods there areGET
andPOST
only. That's why you receiveMethodNotAllowed
.The solution to your problem is not to pass the
manuscript_id
as a JSON body of the request{ "manuscript": 7, }
But to pass it directly to the url:
And you just register your viewset like:
router.register(r'manuscripts', ManuscriptViewSet.as_view(), name='manuscripts')
As you see, DRF generates the urls automatically for you.
这篇关于Django Rest Framework ModelViewSet上的Delete方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!