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

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()获取要统计的文章对象,这就带来了第三次调用。
  • 其他可能的触发场景
    排查完前两项后如果还有多余调用,可以检查:
    1. 是否在get_context_data、权限校验方法、dispatch方法等其他自定义逻辑里手动调用了get_object()
    2. 模板渲染时有没有自定义标签、过滤器间接调用了get_object()
    3. 开发环境下调试工具、路由匹配错误(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:36:00