python - 如果没有找到对象,Django 将返回什么?为什么我会得到DoesNotExist

标签 python django django-models

我有一个 MySQL 表,其中有 Django 注册某个用户已“连接”到某个单元。为此,我必须检查该设备是否已连接到其他用户。 (模型:AppUnitSession)

因此,在我的函数中,我得到三个对象(模型)作为输入(用户、用户 session 、车辆)

我遇到的问题是我对 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)

从调用堆栈中我可以看到车辆.gps_unit_id 的值已设置:

{'gps_unit_id': 775L}

AppUnitSession 表中没有与此匹配的记录!该表中的所有记录都有gps_units_id = NULL(ea,该单位可用,用户可以继续,之后将有一个带有gps_unit_id集的记录。如果找到 session ,我需要做更多的工作。

首先我不希望出现错误。但我也想要一些我可以迭代或检查它的长度(> 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 而不是 filter。 get 与 filter 对一个对象的读取性能 here .

关于python - 如果没有找到对象,Django 将返回什么?为什么我会得到DoesNotExist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22246645/

相关文章:

python - 如何通过 id 连接两个模型(没有外键)并按管理中的链接模型字段排序

python - 正则表达式类似日期的字符串

python - 在Django模型中,有没有办法通过非pk列从多个表中选择属性并点击数据库一次?

python-3.x - Django多对一关系将数据添加到多方

python - SQLAlchemy 相当于 Django ORM 的关系生成过滤器

python - 检索 ManyToManyField 的类

python - 如何模拟缺失的属性

python - 循环 pandas 数据帧的每一行

python - 没有名为 httplib2 的模块,但已安装 httplib2

Django模板如何对简单标签返回的结果应用过滤器