Django测试时Fixtures加载顺序错误吗?
我在测试我的应用程序时遇到了一些问题,不太明白为什么会这样。我正在为我的测试加载一些数据,这些数据之间有相互关联的外键。它们必须按照特定的顺序加载,否则就会出错。
我加载的数据是:
["test_company_data", "test_rate_index", 'test_rate_description']
首先是公司数据。test_rate_index 这个数据依赖于公司数据的外键,而 test_rate_description 这个数据又依赖于 test_rate_index 中声明的一个模型的外键。(顺便提一下,不同的测试需要不同的数据,这就是我不把所有东西都放在一起的原因)
如果我按照 Django 的标准流程来加载测试,这些数据就不会按照正确的顺序加载。
class TestPackages(test.TestCase): fixtures = ["test_company_data", "test_rate_index", "test_rate_description",]
我收到的提示是
DoesNotExist: RateDescription matching query does not exist.
但是如果我把数据的顺序反过来(虽然这样做没有道理),它就能正常工作:
fixtures = ["test_rate_description", "test_company_data", "test_rate_index",]
Django 的文档上说,数据会按照声明的顺序加载,但这似乎并不是这样。
作为一种变通办法,我没有使用 Django 的
call_command('loaddata', *fixtures, **{ 'verbosity': 0, 'commit': False, 'database': 'default' })
而是在 setUp 方法中使用了一个不同的函数,逐个加载这些数据。
def load_fixtures(fixtures): for fixture in fixtures: call_command('loaddata', fixture, **{ 'verbosity': 0, 'commit': False, 'database': 'default' })
我是不是做错了什么,或者有什么我没有理解的地方,导致我在尝试使用标准方法时,数据没有按照正确的顺序加载?
1 个回答
Django的文档说,数据加载的顺序是按照声明的顺序来进行的,但这似乎并不是实际情况。
这确实有点奇怪。我在测试我的一个项目时(Django 1.2.1,Python 2.6.2,Postgresql 8.3.11),数据加载的顺序是正确的。
下面是我会采取的一些排查步骤。
DoesNotExist: 找不到匹配的RateDescription查询。
你是在加载数据时遇到这个错误,还是在执行测试时遇到的?你能找到引发这个错误的数据或代码吗?如果需要,可以提高输出的详细程度。
你能尝试从命令行执行一个
loaddata
命令吗?连续调用三次,每次传入一个数据文件的名字,确保顺序是正确的。看看数据是否能成功加载。我知道你可能已经检查过了,但能不能确认一下第一个和第二个数据文件里没有任何
RateDescription
的数据?