如何仅允许继承HasCommentsMixin的模型创建评论?
仅允许继承指定Mixin的模型创建评论的权限校验实现
核心逻辑是在评论创建的权限校验环节,检查目标模型是否继承了HasCommentsMixin,结合你项目的自定义内容类型机制,具体实现如下:
方法一:自定义权限类(适用于Django REST Framework)
如果你的项目用DRF,推荐通过自定义权限类来统一校验:
from rest_framework.permissions import BasePermission from your_app.models import HasCommentsMixin class CanCreateCommentPermission(BasePermission): def has_permission(self, request, view): # 从请求中获取自定义内容类型标识(根据你项目的实际参数名调整) target_content_type_id = request.data.get('content_type_id') # 调用项目中自定义的方法,通过内容类型ID获取对应的模型类 target_model = get_custom_content_type_model(target_content_type_id) # 核心判断:检查模型是否继承自HasCommentsMixin return issubclass(target_model, HasCommentsMixin)
之后在评论创建的视图类中配置这个权限:
from rest_framework.views import APIView class CommentCreateView(APIView): permission_classes = [CanCreateCommentPermission] def post(self, request): # 评论创建逻辑 ...
方法二:直接在视图/业务逻辑中校验
如果是普通Django视图,可直接在创建逻辑前加入校验:
from django.http import HttpResponseForbidden from your_app.models import HasCommentsMixin def create_comment(request): if request.method == 'POST': target_content_type_id = request.POST.get('content_type_id') target_model = get_custom_content_type_model(target_content_type_id) # 校验模型是否允许创建评论 if not issubclass(target_model, HasCommentsMixin): return HttpResponseForbidden("该模型不支持创建评论") # 执行评论创建操作 ...
关键说明
issubclass(target_model, HasCommentsMixin)是判断继承关系的核心方法,由于HasCommentsMixin是抽象基类,这个方法能准确识别所有继承它的模型get_custom_content_type_model需要替换成你项目中实际的自定义内容类型解析方法,确保能通过标识正确获取到对应的模型类- 若校验不通过,返回403禁止访问响应即可,符合HTTP规范
内容的提问来源于stack exchange,提问作者Constantine Black
相关产品推荐
相关产品推荐

