为什么 django ContentType id 会改变?

Why do django ContentType ids change?

我正在尝试使用 django 的内容类型库,但我发现了一些奇怪的东西。

下一行:

for content_type in ContentType.objects.all():
    print "%s: %s" % (content_type.id, content_type.model)

根据调用时间为我的每个模型打印不同的 ID。

当我 运行 测试套件时,它首先打印:

1: logentry
2: permission
3: group
4: user
5: contenttype
6: session
12: tagtagrule
15: concepttag
16: difficultytag
17: questiontypetag
18: questionformattag
19: sharedassetconcepttag
20: curriculumtag
21: objectposition
22: usermediaimage
23: objecttag

但是在这条消息之后:

Creating test database for alias 'default'...

它似乎重新索引所有内容并打印:

1: logentry
2: permission
3: group
4: user
5: contenttype
6: session
7: concepttag
8: difficultytag
9: questiontypetag
10: questionformattag
11: sharedassetconcepttag
12: curriculumtag
13: tagtagrule
14: objecttag

这是怎么回事?

在第一个实例中,您的打印代码似乎 运行 太早了,在默认数据库连接被交换为测试数据库之前Django 测试运行器...

Creating test database for alias 'default'... 消息之后,这意味着 Django 已经创建了单独的数据库,您的所有测试都将使用该数据库

然后当您的打印代码再次运行时,您会看到测试数据库中的内容

默认数据库中内容类型的不同顺序和不连续 ID 反映了您在开发期间从项目中添加(和删除)模型的顺序

在测试数据库中看到的连续 id 序列反映了一个事实,即它查看了您当前的所有模型并在一个新的空数据库中为它们创建了内容类型

您应该绝对不应该期望您的内容类型在您的测试(或您的项目代码)中具有特定的 id 值。您应该通过 modelapp_label.

查询来检索内容类型