我正在尝试检索一个查询集:
models = MyModel.objects.filter(starttime__lt=sometime)
使用 VS2013 运行时,由于某种原因,这会执行查询(永远占用,我稍后会链接更多过滤器..)。我知道查询会执行,因为当它完成时,结果会在 Locals 窗口中可用。
当我在 VS2013 之外运行它时,它运行正常。
我如何配置(调试器?)不这样做?
我正在尝试检索一个查询集:
models = MyModel.objects.filter(starttime__lt=sometime)
使用 VS2013 运行时,由于某种原因,这会执行查询(永远占用,我稍后会链接更多过滤器..)。我知道查询会执行,因为当它完成时,结果会在 Locals 窗口中可用。
当我在 VS2013 之外运行它时,它运行正常。
我如何配置(调试器?)不这样做?
目前尚不清楚您是只是在调试器下运行此代码,还是单步执行它(或遇到断点,或类似的东西)。如果是后者,那么这是预期的行为 - 调试器尝试在 Locals 窗口中显示所有本地变量的值,它的方式是通过调用repr
, 并且对于集合,查看内容以查看是否存在是任何子项。如果集合被延迟加载,这将导致它加载。
对于 PTVS 2.1,我们稍微改变了这个逻辑,以便只能迭代一次的对象(如生成器)在您尝试扩展它之前不会被调试器迭代(参见this和this)。不幸的是,我认为这不适用于 QuerySet,因为它可以被迭代多次。
似乎在某些情况下,显式请求某些类型不被迭代,甚至可能根本不被 repr'd 会很有用。这将是一个有趣的功能请求——你能把它提交到我们的跟踪器上吗?
同时,您可以在本地破解调试器代码以执行您想要的操作。查看visualstudio_py_util.py
“C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio”(针对您的位数和 VS 版本进行了调整),class SafeRepr
. _repr
您可以在要检查的方法顶部附近插入一个新分支QuerySet
,并打印出一个不会触发延迟加载的自定义 repr。
I'm making a sort of wild guess here (since I do not use windows), here is what I think is going on:
The debugger is printing the contents of your variables for you, the problem is that Django's queryset are evaluated when they are printed, here is the code I think is being executed. I guess you could use breakpoints instead of stepping (assuming that you are stepping) to avoid the printing of the queryset.