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

过滤器代码及类方法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

额外优化建议

  1. 权限逻辑优化:你当前的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
    
  2. 使用django-filter简化过滤:可以引入django-filter库,通过定义FilterSet来更优雅地处理过滤逻辑,减少手动判断的代码量,同时自动处理参数验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:47:42