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

如何仅允许继承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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:40:55