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

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})

额外注意事项

  1. 你的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){

  });
  1. 模型中date_in字段用datetime.now可能存在时区问题,建议替换为Django的timezone.now,记得先导入from django.utils import timezone。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:07:44