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
相关产品推荐
相关产品推荐

