Django继承HitCountDetailView的视图get_object被调用3次的原因?
get_object() 被调用3次的常见原因
- 重写逻辑存在冗余调用
你在自定义的get_object()里先执行了super().get_object()触发了第一次父类查询,之后又手动调用get_object_or_404(Article, slug=slug)做了第二次重复查询,这两步本身就会触发两次方法内的打印语句。 - 父类
HitCountDetailView内置逻辑额外触发调用
该类是django-hitcount包提供的访问统计视图,它内置的访问次数统计逻辑会额外调用一次get_object()获取要统计的文章对象,这就带来了第三次调用。 - 其他可能的触发场景
排查完前两项后如果还有多余调用,可以检查:- 是否在
get_context_data、权限校验方法、dispatch方法等其他自定义逻辑里手动调用了get_object() - 模板渲染时有没有自定义标签、过滤器间接调用了
get_object() - 开发环境下调试工具、路由匹配错误(比如favicon请求命中该视图)也可能导致额外的视图触发
- 是否在
修复建议
你当前的get_object()查询逻辑是完全冗余的,父类HitCountDetailView本身就支持根据slug参数查询对应对象,不需要重复查询,修改为以下逻辑即可避免重复查询:
def get_object(self): article = super(ArticleDetailView, self).get_object() print(article.some_count.counts) return article
如果需要精准定位调用来源,可以在get_object()中加入调用栈打印代码,直接查看每次调用的触发位置:
import traceback def get_object(self): print("=== 调用栈 ===") traceback.print_stack() # 后续原有逻辑
内容的提问来源于stack exchange,提问作者Vaibhav Shukla
相关产品推荐
相关产品推荐

