为什么django ContentType ids会发生变化?

时间:2015-09-08 14:46:28

标签: python django django-models django-contenttypes

我试图使用django的contenttypes库,我发现了一些奇怪的东西。

以下一行:

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

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

似乎在第一个实例中,您的打印代码在此过程中运行太早,然后由Django测试运行程序为测试数据库交换了默认数据库连接...

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

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

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

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

绝对不希望期望您的内容类型在您的测试(或您的项目代码)中具有特定的ID值。您应该通过modelapp_label查询内容类型来检索内容类型。