我最近在从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
属性包含来自INSERT
调用的doc.save()
SQL,但是不包含(在任何时候)SELECT
来自三个现有SearchDocument SELECT
查询中的任何一个应该执行到此点的SQL。
据我所知,这段代码在我们从Django 1.4迁移到Django 1.6之前就已经开始了。我知道有些查询逻辑在1.4和1.6之间发生了变化,我想知道是否存在一个设置(可能是围绕缓存?),这会导致我们的测试出现问题。
编辑:经过多次黑客攻击后,我已经能够确定将此测试类移至SimpleTestCase
而不是TestCase
类,其中TransactionalTestCase
子类(其中将每个测试包装在数据库事务中)解决了我看到的问题,这些问题是在保存后没有显示的项目。看来事务管理中的某些事情导致了保存问题。
答案 0 :(得分:0)
引用我的编辑,因为这是我们最终解决它的方式:
经过多次黑客攻击之后,我已经能够确定将此测试类移动到SimpleTestCase而不是TestCase类,其子类TransactionalTestCase(它在数据库事务中包装每个测试)解决了我的问题在他们被保存之后看到没有出现的物品。看来事务管理中的某些事情导致了保存问题。