1

我正在尝试检索一个查询集:

models = MyModel.objects.filter(starttime__lt=sometime) 

使用 VS2013 运行时,由于某种原因,这会执行查询(永远占用,我稍后会链接更多过滤器..)。我知道查询会执行,因为当它完成时,结果会在 Locals 窗口中可用。

当我在 VS2013 之外运行它时,它运行正常。

我如何配置(调试器?)不这样做?

4

2 回答 2

1

目前尚不清楚您是只是在调试器下运行此代码,还是单步执行它(或遇到断点,或类似的东西)。如果是后者,那么这是预期的行为 - 调试器尝试在 Locals 窗口中显示所有本地变量的值,它的方式是通过调用repr, 并且对于集合,查看内容以查看是否存在是任何子项。如果集合被延迟加载,这将导致它加载。

对于 PTVS 2.1,我们稍微改变了这个逻辑,以便只能迭代一次的对象(如生成器)在您尝试扩展它之前不会被调试器迭代(参见thisthis)。不幸的是,我认为这不适用于 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。

于 2014-03-11T18:15:20.657 回答
0

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.

于 2014-03-11T13:24:36.827 回答