我试图使用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
这里发生了什么?
答案 0 :(得分:3)
似乎在第一个实例中,您的打印代码在此过程中运行太早,然后由Django测试运行程序为测试数据库交换了默认数据库连接...
在Creating test database for alias 'default'...
消息之后,这意味着Django创建了将由您的所有测试使用的单独数据库
然后当您的打印代码再次运行时,您会看到测试数据库中的内容
默认数据库中内容类型的不同顺序和不连续ID反映了在开发过程中从项目中添加(和删除)模型的顺序
在测试数据库中看到的连续id序列反映了这样一个事实:它查看了所有当前模型,并在新的空数据库中为它们创建了内容类型
您绝对不希望期望您的内容类型在您的测试(或您的项目代码)中具有特定的ID值。您应该通过model
和app_label
查询内容类型来检索内容类型。