Django测试时Fixtures加载顺序错误吗?

7 投票
1 回答
3092 浏览
提问于 2025-04-16 03:20

我在测试我的应用程序时遇到了一些问题,不太明白为什么会这样。我正在为我的测试加载一些数据,这些数据之间有相互关联的外键。它们必须按照特定的顺序加载,否则就会出错。

我加载的数据是:

["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 个回答

1

Django的文档说,数据加载的顺序是按照声明的顺序来进行的,但这似乎并不是实际情况。

这确实有点奇怪。我在测试我的一个项目时(Django 1.2.1,Python 2.6.2,Postgresql 8.3.11),数据加载的顺序是正确的。

下面是我会采取的一些排查步骤。

DoesNotExist: 找不到匹配的RateDescription查询。

  1. 你是在加载数据时遇到这个错误,还是在执行测试时遇到的?你能找到引发这个错误的数据或代码吗?如果需要,可以提高输出的详细程度。

  2. 你能尝试从命令行执行一个loaddata命令吗?连续调用三次,每次传入一个数据文件的名字,确保顺序是正确的。看看数据是否能成功加载。

  3. 我知道你可能已经检查过了,但能不能确认一下第一个和第二个数据文件里没有任何RateDescription的数据?

撰写回答