Esc*_*her 9 python django django-rest-framework
在DRF的DefaultRouter url路由器中,它需要一个{lookup}参数来将DELETE请求路由到a的destroy方法ModelViewSet(因此,您将请求将对象实例删除到端点{prefix}/{lookup}/).
这适用于删除单个实例,但我想将该功能扩展为在单个请求中删除多个实例.假设lookup调用参数并调用uuid模型Product.这是一个扩展版本destroy:
def destroy(self, request, uuid=None):
"""
Overridden method allows either url parameter of single UUID
(to delete a single instance), or multiple query parameters `uuids`
to delete multiple instances.
"""
if not uuid:
uuids = request.query_params.get('uuids', None)
if not uuids:
return Response(status=status.HTTP_404_NOT_FOUND)
if len(uuids) != Product.objects.filter(uuid__in=uuids).count():
return Response(status=status.HTTP_404_NOT_FOUND)
Product.objects.filter(uuid__in=uuids).delete()
else:
instance = self.get_object(uuid)
if not instance:
return Response(status=status.HTTP_404_NOT_FOUND)
instance.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
Run Code Online (Sandbox Code Playgroud)
所以这个版本uuids[]在url中接受DELETE请求和多个查询参数.现在我只需将其路由到urls.py:
from rest_framework.routers import DefaultRouter, Route
class BulkDeleteRouter(DefaultRouter):
"""
a custom URL router for the Product API that correctly routes
DELETE requests with multiple query parameters.
"""
def __init__(self, *args, **kwargs):
super(BulkDeleteRouter, self).__init__(*args, **kwargs)
self.routes += [
Route(
url=r'^{prefix}{trailing_slash}$',
mapping={'delete': 'destroy'},
name='{basename}-delete',
initkwargs={'suffix': 'Delete'}
),
]
bulk_delete_router = BulkDeleteRouter()
bulk_delete_router.register(r'product', ProductViewSet, base_name='product')
Run Code Online (Sandbox Code Playgroud)
不幸的是,这已经杀死了我的url路由器.它不会解决GET到视图集中的适当方法,我不明白为什么 - 我不BulkDeleteRouter应该从这个扩展这个功能DefaultRouter?我做错了什么?
忘记将路由器 url 添加到urlpatterns. 我一定是瞎了。
urlpatterns += [
url(r'^API/', include(bulk_delete_router.urls, namespace='api')),
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2980 次 |
| 最近记录: |