Django过滤Query时出现'TevList' object has no attribute 'META'错误求助
解决'TevList' object has no attribute 'META'报错
错误根源
你遇到的报错核心问题出在views.py的返回逻辑上:
return JsonResponse({'data': list(qs_list)})
当你调用.first()后,qs_list已经不是Django查询集,而是单个TevList模型实例。此时用list()去转换单个模型对象,Python会尝试迭代该对象,而Django模型实例在迭代过程中会内部访问_meta属性(和你看到的META报错直接相关),这种用法本身完全错误。
解决方案
根据你的需求,提供两种可行修复方式:
方案1:返回单个对象数据(匹配你用.first()的意图)
用Django自带的model_to_dict工具把模型实例转成可序列化的字典,修改views.py:
from django.forms.models import model_to_dict from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def tevemployee(request): tev_id = request.POST.get('tev_id') tev_obj = TevList.objects.filter(id=tev_id).first() # 对象存在则转字典,否则返回空数据 data = model_to_dict(tev_obj) if tev_obj else {} return JsonResponse({'data': data})
方案2:返回包含单个对象的列表
如果前端需要统一处理列表格式数据,去掉.first(),遍历查询集转成字典:
from django.forms.models import model_to_dict from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def tevemployee(request): tev_id = request.POST.get('tev_id') qs = TevList.objects.filter(id=tev_id) # 把查询集中的每个对象转成字典 data_list = [model_to_dict(obj) for obj in qs] return JsonResponse({'data': data_list})
额外注意事项
- 你的AJAX代码缺少CSRF令牌,Django默认会拦截不带令牌的POST请求,建议补充:
$('.item-details').click(function (event) { let id = $(this).attr("id"); $.ajax({ type: "POST", url: "{% url 'tev-employee' %}", data:{ tev_id : id, csrfmiddlewaretoken: '{{ csrf_token }}' } }).done(function(data){ });
- 模型中
date_in字段用datetime.now可能存在时区问题,建议替换为Django的timezone.now,记得先导入from django.utils import timezone。
内容的提问来源于stack exchange,提问作者Shainnah Jane
相关产品推荐
相关产品推荐

