我正在尝试检索QuerySet:
models = MyModel.objects.filter(starttime__lt=sometime)
当使用VS2013运行时,这由于某种原因执行查询(永远,我后来链接更多的过滤器..)。 我知道查询会执行,因为当它完成时,结果可以在Locals窗口中找到。
当我在VS2013外部运行时,它运行正常。
如何配置(调试器?)不执行此操作?
答案 0 :(得分:1)
您是否只是在调试器下运行此代码,或者您正在逐步执行此代码(或点击断点或其他内容)并不完全清楚。如果是后者,那么这是预期的行为 - 调试器试图在Locals窗口中显示所有本地的值,以及它通过调用repr
的方式,并且对于集合,在内容以查看是否有任何子项。如果该集合被延迟加载,这将导致它加载。
对于PTVS 2.1,我们稍微更改了这个逻辑,以便在您尝试扩展它之前,调试器不会迭代只能迭代一次的对象(如生成器)(请参阅this和this )。不幸的是,我认为这不适用于QuerySet,因为它可以多次迭代。
似乎有些情况下显式请求某些类型不被迭代,甚至可能甚至重新编译都是有用的。这将是一个有趣的功能请求 - 您可以在我们的tracker上提交吗?
与此同时,您可以在本地修改调试器代码以执行您想要的操作。查看“C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ Extensions \ Microsoft \ Python Tools for Visual Studio”中的visualstudio_py_util.py
(根据您的位数和VS版本进行调整),班SafeRepr
。您可以在_repr
方法的顶部附近插入一个新分支,以检查QuerySet
,并打印出不会触发延迟加载的自定义repr。
答案 1 :(得分:0)
我在这里做了一个疯狂的猜测(因为我不使用Windows),这就是我的想法:
调试器正在为您打印变量的内容,问题是Django的查询集在打印时会被评估here is the code I think is being executed。我猜你可以使用断点而不是步进(假设你是踩踏)来避免打印查询集。