如何设置仅状态为waiting的Order对象可通过RetrieveDestroyAPIView删除?
解决方案:仅允许删除状态为waiting的订单
首先明确你的需求:只有当订单的status字段为WAITING(对应值'WA')时,才能执行删除操作。下面给你两种实用的实现方式,你可以根据场景选择:
方法一:直接重写视图的destroy方法
这种方式适合仅在当前OrderDeleteAPIView中使用该规则的场景,代码直观且无需额外类:
修改你的视图类,重写destroy方法,在执行删除前检查订单状态:
from rest_framework.exceptions import PermissionDenied class OrderDeleteAPIView(generics.RetrieveDestroyAPIView): queryset = Order.objects.all() serializer_class = OrderDeleteSerializer # permission_classes = (OwnerCanManageOrReadOnly,) lookup_field = 'id' def destroy(self, request, *args, **kwargs): # 获取要删除的订单实例 order_instance = self.get_object() # 检查订单状态是否为WAITING if order_instance.status != Order.WAITING: # 状态不符合时抛出权限拒绝异常,DRF会自动返回403响应 raise PermissionDenied("只有状态为waiting的订单才能被删除") # 状态符合,调用父类方法执行删除 return super().destroy(request, *args, **kwargs)
方法二:自定义权限类(推荐复用场景)
如果项目中还有其他视图需要用到“仅允许删除waiting状态订单”的规则,自定义权限类会更利于代码复用:
第一步:创建自定义权限类
from rest_framework import permissions from .models import Order # 确保导入你的Order模型 class CanDeleteOnlyWaitingOrder(permissions.BasePermission): def has_object_permission(self, request, view, obj): # 仅对DELETE请求做权限检查,RetrieveDestroyAPIView的GET请求不受影响 if request.method == 'DELETE': # 订单状态为WAITING时返回True,允许删除 return obj.status == Order.WAITING # 非DELETE请求默认允许访问(比如查看订单详情) return True
第二步:在视图中使用该权限类
把自定义权限类添加到视图的permission_classes列表中:
class OrderDeleteAPIView(generics.RetrieveDestroyAPIView): queryset = Order.objects.all() serializer_class = OrderDeleteSerializer permission_classes = (CanDeleteOnlyWaitingOrder,) # 替换或添加到权限列表 lookup_field = 'id'
两种方法的效果一致:当用户尝试删除非waiting状态的订单时,DRF会返回403 Forbidden响应,并携带你设置的提示信息。
内容的提问来源于stack exchange,提问作者Kosar Kazemi
相关产品推荐
相关产品推荐

