Django调用HTTP接口时报'QuerySet'对象无movies属性的AttributeError
报错原因
你在视图代码中犯了变量名引用错误:
ac = Actor.objects.all()拿到的是所有演员的QuerySet集合对象,不是单个演员实例,本身没有movies关联属性- 循环中你错误调用了
ac.movies.values("title"),而不是遍历得到的单个演员实例a的movies属性 - 你在Django Shell中测试时调用的是单个演员实例
a的movies属性,所以运行正常
解决方法
第一步:修正视图代码的变量引用
把views.py中get方法里的错误行替换:
# 错误写法 c =[i for i in ac.movies.values("title")] # 修正为 c =[i for i in a.movies.values("title")]
第二步(可选优化):添加预加载避免N+1查询问题
查询演员时提前预加载关联的电影数据,减少数据库查询次数提升性能:
class MoviesView(View): def get(self,request): # 用prefetch_related预拉取所有关联的movies数据 ac = Actor.objects.prefetch_related("movies").all() results=[] for a in ac: c =[i for i in a.movies.values("title")] results.append( { "first_name" : a.first_name, "movies" : c, } ) return JsonResponse({"result":results}, status = 201)
内容的提问来源于stack exchange,提问作者kyle
相关产品推荐
相关产品推荐

