Django访问URL报StaffFilter无_meta属性错误如何解决
AttributeError: type object 'StaffFilter' has no attribute '_meta' 报错排查方案 你贴的filters.py里Meta类的基础写法是对的,这个报错基本都是配置引用错误导致的,按以下优先级排查即可:
- 首先检查视图类的过滤器配置:这是这个报错最高发的原因。不要把自定义的
StaffFilter放到filter_backends列表里,这个配置项只接收DjangoFilterBackend这类过滤后端类,你的自定义过滤器要赋值给filterset_class属性,直接传类本身,不要加括号实例化。
正确的视图配置参考:
把过滤器错放到from rest_framework.viewsets import ModelViewSet from django_filters.rest_framework import DjangoFilterBackend from .models import Staff from .serializers import StaffSerializer from .filters import StaffFilter class StaffViewSet(ModelViewSet): queryset = Staff.objects.all() serializer_class = StaffSerializer filter_backends = [DjangoFilterBackend] filterset_class = StaffFilter # 自定义过滤器写在这里filter_backends时,框架会把它当成后端类实例化,内部逻辑找不到对应_meta属性就会抛你遇到的错。 - 修正自定义In查询过滤器的写法:你代码里直接用
BaseInFilter实例化字段是错的,这个类是抽象基类,必须和具体的过滤器字段类型混合成子类后才能使用,直接用会导致过滤器类内部属性初始化异常。
修正后的filters.py代码:from django_filters.rest_framework import FilterSet from django_filters import BaseInFilter, CharFilter from .models import Staff # 自定义支持多选in查询的字符串过滤器 class CharInFilter(BaseInFilter, CharFilter): pass class StaffFilter(FilterSet): department__in = CharInFilter(field_name="department", lookup_expr='in') job_grade__in = CharInFilter(field_name="job_grade", lookup_expr='in') class Meta: model = Staff fields = ['job_grade__in', 'department__in'] - 排查导入错误:全局搜索所有引用
StaffFilter的位置,确认导入的是filters.py下的目标类,不要把模型类Staff、其他同名类/实例错当成过滤器传入视图配置。 - 检查依赖版本:如果以上配置都没问题,执行
pip install --upgrade django-filter升级到2.2.0以上的稳定版本,老版本django-filter和高版本Django、DRF搭配时存在Meta类识别兼容问题。
内容的提问来源于stack exchange,提问作者Gavin Teo Juen
相关产品推荐
相关产品推荐

