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

时间:2014-03-07 09:47:32

标签: python django django-models

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

所以在我的函数中我得到三个对象(模型)作为输入(user,usersession,vehicle)

我遇到的问题是我对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(ea,单位可用,用户可以继续,之后会有一个gps_unit_id设置的记录。如果找到了会话,我需要做更多的工作。

首先,我不想要错误。但是我也想要一些我可以迭代或检查它的长度(> 1)进行更多检查的东西。

我有点卡在这一点上,所以欢迎提供帮助和建议。

1 个答案:

答案 0 :(得分:1)

一种方法是使用filter而不是get,但过滤器会返回对象列表,而get会返回一个对象(如果找到)。

使用sessions = AppUnitSession.objects.filter(gps_unit_id=vehicle.gps_unit_id)

而不是#sessions = AppUnitSession.objects.get(gps_unit_id=vehicle.gps_unit_id)

如果您只想摆脱错误,其他方法是执行exception handling

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。读取一个对象here的get vs filter的性能。