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

Django admin存在Owner数据却触发DoesNotExist且try-except均执行问题

异常触发原因说明

不存在try和except分支同时执行的情况,你观察到的现象是try块内代码按顺序执行导致的:

  1. 第一行visitors = Owner.objects.exclude(user=request.user).filter(checked_in=True).count()执行完全合法:count()方法永远返回数字,哪怕没有匹配数据也返回0,不会抛出DoesNotExist异常,所以这行执行成功,visitors变量完成赋值
  2. 异常是在第二行current = Owner.objects.get(user=u)触发的:Django的get()方法要求有且仅有1条匹配数据,找不到匹配的Owner记录就会抛出Owner.DoesNotExist,此时try块会中断执行,直接跳转到except分支
  3. 因为visitors在异常抛出前已经完成赋值,所以except分支里可以正常打印这个变量,并非两个分支同时运行。
admin可见但查询不到的常见原因
  • 你在admin面板看到的是其他用户关联的Owner条目,当前登录的request.user没有对应的Owner关联记录
  • Owner模型自定义了模型管理器,给objects加了默认过滤条件(比如软删除过滤、状态过滤),导致符合条件的条目被过滤掉了,admin面板用的是默认管理器所以可以看到所有数据
  • 当前请求的用户是未登录的匿名用户,request.user是AnonymousUser实例,必然匹配不到Owner表的user外键
  • 你在未提交的事务中创建了Owner记录,当前请求所在的事务未提交,所以查询不到,admin属于独立事务可以看到已提交的记录
调试步骤
  • 在current = Owner.objects.get(user=u)前增加打印,输出当前用户的唯一标识:print(u.id, u.username, u.is_authenticated),确认当前登录用户身份是否符合预期
  • 打印所有Owner关联的用户信息做对比:print(list(Owner.objects.values_list('user__id', 'user__username'))),确认是否存在和当前用户id匹配的条目
  • 把get方法替换为filter测试:print(Owner.objects.filter(user=u).count()),如果返回0就说明确实没有匹配当前用户的Owner记录,确认是数据问题还是过滤规则问题
  • 检查Owner模型的管理器定义,确认是否替换了默认的objects管理器,有没有加默认的过滤条件
  • 确认当前请求是否在未提交的事务中,是否有前置逻辑创建了Owner但未执行commit操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:06:04