如果未找到对象,Django 返回什么?我为什么会收到 DoesNotExist?

1 投票
1 回答
2373 浏览
提问于 2025-04-17 21:16

我有一个MySQL表,里面记录了某个用户与一个单位的连接情况。在这之前,我需要检查这个单位是否已经被其他用户连接了。(模型:AppUnitSession)

在我的函数中,我需要输入三个对象(模型):用户、用户会话和车辆。

我遇到的问题是,我对AppUnitSession的查询失败了,出现了一个错误:

Exception Type: DoesNotExist 
Exception Value: AppUnitSession matching query does not exist. 

这个错误发生在这段代码的第一行:

sessions = AppUnitSession.objects.get(gps_unit_id=vehicle.gps_unit_id)
sessions = sessions.exclude(validation_date__isnull=True)
sessions = sessions.exclude(user_session_id=usersession.user_session_id)

从调用栈中我可以看到,vehicle.gps_unit_id的值已经设置好了:

{'gps_unit_id': 775L}

但是在AppUnitSession表中没有任何记录与之匹配!这个表中的所有记录的gps_units_id都是NULL(也就是说,这个单位是可用的,用户可以继续操作,之后会有一条记录的gps_unit_id被设置。如果找到了会话,我还需要做更多的工作。

一开始我不想要这个错误。同时,我也希望能得到一些可以遍历的东西,或者检查它的长度是否大于1,以便进行更多的检查。

我在这个问题上有点卡住了,所以欢迎任何帮助和建议。

1 个回答

1

一种方法是用 filter 代替 get,不过 filter 会返回一个对象列表,而 get 如果找到的话只返回一个对象。

你可以用 sessions = AppUnitSession.objects.filter(gps_unit_id=vehicle.gps_unit_id) 来替代 #sessions = AppUnitSession.objects.get(gps_unit_id=vehicle.gps_unit_id)

如果你只是想避免错误,另一种方法是进行 异常处理

try:
    sessions = AppUnitSession.objects.get(gps_unit_id=vehicle.gps_unit_id)
    sessions = sessions.exclude(validation_date__isnull=True)
    sessions = sessions.exclude(user_session_id=usersession.user_session_id)
except AppUnitSession.DoesNotExist:
    #some code when the object does not exists

不过,如果你只想获取一个对象,使用 get 会更好。关于 getfilter 在获取单个对象时的性能比较,可以在 这里查看。

撰写回答