mysql - "ContentType matching Query does not exist"- 仅在 SQLite 上,不适用于 MySQL

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

最佳答案

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

在我的应用程序代码中,我尝试通过以下方式查询 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 关心(默认情况下)大小写,因此我的查询我的测试确实失败了。

关于mysql - "ContentType matching Query does not exist"- 仅在 SQLite 上,不适用于 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29193141/

相关文章:

c# - 当应用程序有很多调用时如何管理连接池限制?

php - codeigniter 不会调用特定 Controller 的任何功能,但可以与其他 Controller 一起正常工作

mysql - 触发每 24 小时更新一次字段

django - django 中的 allowed_hosts 和 cors_origin_regex_whitelist 有什么区别?

python - Django REST 仅列表(无详细信息)ViewSet

c# - EF6,如果没有 App.config,SQLite 将无法工作

java - 如何将具有文本数据类型的数据库字段中的 java 日期 toString 值格式化为 mysql 日期表示形式?

Django默认语言

SQLite3 使用 LEFT JOIN 和 UNION 模拟 RIGHT OUTER JOIN

mysql - 何时使用 SQL 数据库中什么类型的表关系