【问题标题】:django rest framework delete item based on a fielddjango rest框架根据字段删除项目
【发布时间】:2015-10-18 09:40:00
【问题描述】:

我正在使用路由器和 ReadOnlyModelViewset,并尝试创建一个 API 服务,该服务允许仅基于项目中的特定字段删除项目,例如: http://localhost/delete_post?author="abc"

我猜 urls.py 和 views.py 需要更改,覆盖路由器和视图模型的正确方法是什么?

models.py

class post(models.Model):
    author = models.CharField(max_length=100)
    text = models.CharField(max_length=100)

views.py

class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    这看起来像是批量删除。我建议通过过滤和自定义列表路由来实现它:

    import django_filters
    from rest_framework import status
    from rest_framework.response import Response
    from rest_framework.decorators import list_route
    
    
    class PostFilterSet(django_filter.FilterSet):
        class Meta:
            model = Post
            fields = (
                'author',
            )
    
    class PostViewSet(viewsets.ReadOnlyModelViewSet):
        queryset = Post.objects.all()
        serializer_class = PostSerializer
        filter_backends = (
            filters.DjangoFilterBackend,
        )
        filter_class = PostFilterSet
    
        @list_route(methods=['post'])
        def delete_post(self, request, *arg, **kwarg):
            # retrieve the selected items
            qs = self.filter_queryset(self.get_queryset())
            # delete the selected item
            qs.delete()
            # return deleted
            return Response(status=status.HTTP_204_NO_CONTENT)
    

    现在在您的路由器中,您有一个名为 /delete_post 的新路由,如果您使用查询参数 author=(不带引号的作者姓名)发布,它将删除所有满足过滤器的帖子。

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 2015-09-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2017-02-04
      • 1970-01-01
      相关资源
      最近更新 更多