“ContentType匹配查询不存在” - 仅限SQLite,而不是MySQL

时间:2015-03-22 10:15:23

标签: mysql django sqlite django-orm django-testing

我遇到了Django Test框架运行方式的奇怪错误。

使用SQLite数据库后端时,所有测试都会因以下错误而崩溃:

  File "[]/core/tests/test_admin.py", line 91, in setUpSomething
    content_type = ContentType.objects.get(app_label='core', model='SomeModel')
  File "[]/lib/python2.7/site-packages/django/db/models/manager.py", line 151, in get
    return self.get_queryset().get(*args, **kwargs)
  File "[]/lib/python2.7/site-packages/django/db/models/query.py", line 310, in get
    self.model._meta.object_name)
DoesNotExist: ContentType matching query does not exist.

但是,相同的代码在MySQL后端下运行良好。

显然Django应该使这些函数与所使用的后端无关?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我不知道我的解决方案是否会有所帮助,但它解决了我的问题,所以就这样了。

在我的应用程序代码中,我试图以下列方式查询ContentType个实例:

email = ContentType.objects.get(app_label="users", model="EmailAddress")

这适用于我们实际的MySQL数据库,但在SQLite测试数据库下测试失败。但是,如果我将模型定义切换为小写,它在两个地方都有效:

email = ContentType.objects.get(app_label="users", model="emailaddress")

我的猜测是,这可能与default collation in MySQL of case-insensitivity有关,因此如果我进行区分大小写比较,则第一个查询不应该有效

实际上,当我查看我的数据库时,model表中的所有django_content_type标签都是小写的,SQLite关注(默认情况下)关于大小写,因此我的测试中的查询合法地失败了。