Django Rest Framework ModelViewSet上的Delete方法 [英] Delete method on Django Rest Framework ModelViewSet

查看:1039
本文介绍了Django Rest Framework ModelViewSet上的Delete方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用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:

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

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 the DefaultRouter docs. It generates automatically your urls within your viewset:

Look closely at the DELETE method. It is on the {prefix}/{lookup}/[.format] url pattern. This means that your corresponding router url is manuscripts/<manuscript_id>/, but you try to send DELETE request to manuscripts/ only, which is the above pattern. You see directly from the table that the allowed HTTP methods there are GET and POST only. That's why you receive MethodNotAllowed.

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:

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆