You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置仅状态为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:43:55