如果未找到对象,Django 返回什么?我为什么会收到 DoesNotExist?
我有一个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
会更好。关于 get
和 filter
在获取单个对象时的性能比较,可以在 这里查看。