过滤器代码及类方法switch调用引发AttributeError,请求协助解决
解决Django过滤器中触发AttributeError的问题
我一眼就看出问题出在你的statusFilter方法里的字典get调用上,这直接导致序列化器拿到字符串而非QuerySet,进而抛出'str'对象没有属性'saved'的错误。
问题根源
在Python中,字典的get()方法语法是dict.get(key, default_value)——第一个参数是要查找的键,第二个是找不到键时返回的默认值。但你现在写的是:
return switcher.get("Invalid Status: ", args)
这相当于用字符串"Invalid Status: "作为键去查找,而把传入的status值作为默认返回值。不管status是有效还是无效值,最终返回的都是字符串而非Job_Application_State的QuerySet实例,序列化器自然没法从字符串里读取saved字段。
修复方案
修正get()方法的参数顺序,同时优化无效状态的处理逻辑:
方法1:状态无效时返回原QuerySet(不做过滤)
def statusFilter(self, queryset, status): if not status: return queryset # 没有传status参数时直接返回原查询集 switcher = { 'saved': queryset.filter(saved=True), 'applied': queryset.filter(applied=True), 'shortlisted': queryset.filter(shortlisted=True), } # 用status作为键查找,找不到则返回原查询集 return switcher.get(status, queryset)
方法2:抛出验证错误(明确告知前端参数无效)
如果你希望在传入无效状态时直接返回错误提示,可以这样写:
from rest_framework.exceptions import ValidationError def statusFilter(self, queryset, status): if not status: return queryset switcher = { 'saved': queryset.filter(saved=True), 'applied': queryset.filter(applied=True), 'shortlisted': queryset.filter(shortlisted=True), } filtered_queryset = switcher.get(status) if not filtered_queryset: raise ValidationError({ "status": "无效的状态值,允许的值为:saved, applied, shortlisted" }) return filtered_queryset
额外优化建议
- 权限逻辑优化:你当前的
get_queryset中,只有当存在查询参数时才过滤当前用户的数据。建议即使没有查询参数,也只返回当前用户的记录,避免泄露其他用户的数据:def get_queryset(self): queryset = Job_Application_State.objects.filter(user=self.request.user) request_queries = self.request.query_params if request_queries: status = request_queries.get('status', None) queryset = self.statusFilter(queryset, status) return queryset - 使用django-filter简化过滤:可以引入
django-filter库,通过定义FilterSet来更优雅地处理过滤逻辑,减少手动判断的代码量,同时自动处理参数验证。
内容的提问来源于stack exchange,提问作者user11879807
相关产品推荐
相关产品推荐

