【发布时间】:2014-04-29 15:04:38
【问题描述】:
最近从 Django 1.4 升级到 Django 1.6 后,我在当前应用程序中遇到了 Django ORM 的问题。此问题仅在运行测试时出现,而不是在开发或生产环境中运行时出现。
更具体地说,我们有一个 post_save 钩子,它从表中收集信息,这些表是我们的主要数据对象的子类,并将存储在这些对象中的数据合并为一个 SearchDocument 对象,然后存储和查询该对象以提供完整的-界面上的文本搜索。这适用于开发和生产环境,但是在尝试运行单元测试时,我们会遇到测试失败的问题。
我们正在调试的方法现在看起来像这样:
def _update_search_document( self, doc ):
"""Updates and saves an existing search document for this model.
This will sync the search text and key/value attributes."""
# A bunch of code updating the model properties prior to saving.
doc.save()
print SearchDocument.objects.all()
print connection.queries:
此代码正确保存,但随后对SearchDocument.objects.all() 的调用返回[],connection.queries 属性包含来自doc.save() 调用的INSERT SQL,但 不 包含 (在任何时候)SELECT SQL 来自三个现存的 SearchDocument SELECT 查询中的任何一个,这些查询应该已经执行到该点。
据我所知,这段代码在我们从 Django 1.4 迁移到 Django 1.6 之前就可以运行。我知道一些查询逻辑在 1.4 和 1.6 之间发生了变化,我想知道是否有一个设置(可能是围绕缓存?)现在导致我们的测试出现问题。
编辑:经过更多的修改,我已经能够确定将这个测试类移动到 SimpleTestCase 而不是 TestCase 子类 TransactionalTestCase 的类(它将每个测试包装在数据库事务中)解决了我看到的项目在保存后未显示的问题。似乎该事务管理中的某些内容导致了保存问题。
【问题讨论】:
-
Django 查询集是惰性的。尝试遍历查询集,然后检查
connection.queries,例如for _ in SearchDocument.objects.all(): break。另外,您是否将DEBUG设置为True? -
遍历查询集显示相同的行为(
print也应该评估查询集)并且 DEBUG 设置为 true。如果设置为 false,则根本不会显示任何查询。
标签: python django django-south