【问题标题】: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=(不带引号的作者姓名)发布,它将删除所有满足过滤器的帖子。