【问题标题】:What does Django return if no objects are found? And why do I get a DoesNotExist如果没有找到对象,Django 会返回什么?为什么我会得到一个 DoesNotExist
【发布时间】:2014-04-10 09:31:37
【问题描述】:

我有一个 MySQL 表,其中我有 Django 注册某个用户“连接”到一个单元。为此,我必须检查设备是否已连接到其他用户。 (型号: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(ea,该单元可用并且用户可以继续,之后将有一个设置了 gps_unit_id 的记录。如果找到会话,我需要做更多的工作。

一开始我不希望出现错误。但我也想要一些我可以迭代或检查它的长度 (>1) 的东西做更多的检查。

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

【问题讨论】:

    标签: python django django-models


    【解决方案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 性能。

    【讨论】:

    • 您不能在get 结果(AppUnitSession 实例)上使用exclude,如果filter 用于获取一个对象,则实际上没有性能问题...
    • npdu 是对的。你必须先exclude,最后get
    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2011-03-28
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多