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

Django删除ExampleModelTag时报Cannot resolve keyword 'author' into field错误排查

问题根源

你为ExampleModelTagViewSet绑定了UserFilterBackend过滤后端,但ExampleModelTag模型本身没有直接定义author字段,过滤逻辑执行时直接调用queryset.filter(author=request.user),Django ORM无法找到对应字段,因此抛出该报错。
ExampleModel模型本身存在author字段,所以对应的视图使用该过滤后端无异常;而ExampleModelTag的author是存储在关联的examplemodel外键指向的模型中,直接查询author字段不存在。

同时需要注意:DRF 处理 DELETE 请求时默认不会触发序列化器的validate校验逻辑,你写在ExampleModelTagSerializer里的权限判断在删除操作时不会生效,必须在查询集过滤阶段完成权限控制。

修复方案

方案1:调整通用过滤后端逻辑,兼容多模型场景

修改UserFilterBackend的代码,针对不同模型适配不同的过滤规则:

class UserFilterBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        model_cls = queryset.model
        # 针对标签模型走跨表关联查询作者
        if model_cls == ExampleModelTag:
            return queryset.filter(examplemodel__author=request.user)
        # 其他自带author字段的模型直接过滤
        return queryset.filter(author=request.user)

方案2:为标签视图单独配置查询集逻辑

移除ExampleModelTagViewSet绑定的通用UserFilterBackend,重写get_queryset方法实现权限过滤:

class ExampleModelTagViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = ExampleModelTagSerializer

    def get_queryset(self):
        # 仅返回当前用户关联的标签
        return ExampleModelTag.objects.filter(examplemodel__author=self.request.user)

内容的提问来源于stack exchange,提问作者user14491987

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:48:03