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

Posted

技术标签:

【中文标题】“ContentType 匹配查询不存在” - 仅在 SQLite 上,而不是 MySQL【英文标题】:"ContentType matching Query does not exist" - only on SQLite, not MySQL 【发布时间】:2015-05-25 10:23:47 【问题描述】:

我在 Django 测试框架的运行方式上遇到了一个奇怪的错误。

使用 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 应该使这些函数与所使用的后端无关?

【问题讨论】:

这个答案可能会有所帮助:***.com/a/17614700/2011147 我已经测试过这种方法,但它不起作用..可能是 Django TestCase 的一些事务特性? 这里有同样的问题:代码适用于 MySql,但不适用于 SQLite 测试数据库。我假设syncdb 的某个版本被用于设置数据库,并且应该更新所有 ContentTypes 模型实例,但显然不是。将进一步调查。 【参考方案1】:

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

在我的应用程序代码中,我尝试通过以下方式查询 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 有关,所以如果我区分大小写比较,第一个查询应该不起作用

确实,当我查看我的数据库时,django_content_type 表中的所有 model 标签都是小写的,并且 SQLite 关心(默认情况下)大小写,所以我在测试中的查询确实失败了。

【讨论】:

以上是关于“ContentType 匹配查询不存在” - 仅在 SQLite 上,而不是 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

仅绑定日期和仅时间

仅 ftping 仅今天的文件

为啥我的 charFormat 样式仅适用于选择,并且仅适用于特定方向的选择?

在oracle中仅选择且仅选择特定记录[关闭]

仅 32 位 MacOS 应用程序可以使用仅 64 位框架吗?

MatFile 对象仅支持 '()' 索引