Django 测试失败,出现 'django.db.utils.ProgrammingError: relation "django_content_type" does not exist' 错误。

4

我正在尝试为一个Django项目编写和运行测试,但是运行

$ python manage.py test apps/actions/tests

提示以下错误:

django.db.utils.ProgrammingError: relation "django_content_type" does not exist

只有在运行测试时才会出现此问题。运行python manage.py runserver没有任何错误,一切正常。我正在使用Django 3.1.3。

以下是完整的回溯信息:

Traceback (most recent call last):
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "django_content_type" does not exist


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Kamil\Projekty\random\manage.py", line 22, in <module>
    main()
  File "C:\Users\Kamil\Projekty\random\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\commands\test.py", line 23, in run_from_argv
    super().run_from_argv(argv)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\commands\test.py", line 53, in handle
    failures = test_runner.run_tests(test_labels)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\test\runner.py", line 695, in run_tests
    old_config = self.setup_databases(aliases=databases)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\test\runner.py", line 614, in setup_databases
    return _setup_databases(
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\test\utils.py", line 170, in setup_databases
    connection.creation.create_test_db(
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\backends\base\creation.py", line 72, in create_test_db
    call_command(
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\__init__.py", line 168, in call_command
    return command.execute(*args, **defaults)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\commands\migrate.py", line 214, in handle
    self.sync_apps(connection, executor.loader.unmigrated_apps)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\core\management\commands\migrate.py", line 352, in sync_apps
    self.stdout.write('    Running deferred SQL...')
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\backends\base\schema.py", line 115, in __exit__
    self.execute(sql)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\backends\base\schema.py", line 142, in execute
    cursor.execute(sql, params)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\backends\utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\Kamil\Projekty\random\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "django_content_type" does not exist

我已经尝试删除并重新创建我的迁移文件。 我的INSTALLED_APPS中有 django.contrib.contenttypes。Traceback没有指向代码中的具体位置,所以我不知道该在哪里查找。

如果有帮助,这是python manage.py showmigrations的输出结果。

actions
 [X] 0001_initial
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
guardian
 [X] 0001_initial
 [X] 0002_generic_permissions_index
integrations
 [X] 0001_initial
links
 [X] 0001_initial
sessions
 [X] 0001_initial
triggers
 [X] 0001_initial
users
 [X] 0001_initial
workers
 [X] 0001_initial

你的 INSTALLED_APPS 中是否包含了 django.contrib.contenttypes - crazychukz
@crazychukz 是的,我会。 - exler
3个回答

4
我明白了,我没有为一个使用了 from django.contrib.contenttypes.models import ContentType 模块的应用程序运行 makemigration <app> 命令。
一些奇怪的情况下,当通过 runserver 命令运行本地服务器时它似乎并不重要,但是在运行 test 命令时失败了。

0

对于楼主来说可能不直接相关,但以下的边缘情况导致了完全相同的错误和回溯:

在我们的一个旧测试套件中,定义了一个“仅用于测试”的模型,没有任何迁移,但是有一个指向ContentType的外键和一个GenericForeignKey(泛关联)。这个仅用于测试的模型显然依赖于django_content_type表。

由于某种原因,如果我们使用本地SQLite数据库(内存中)运行测试,这不是一个问题:所有测试都正常运行。

然而,切换到本地PostgreSQL数据库后,尝试运行测试时出现了错误:

django.db.utils.ProgrammingError: relation "django_content_type" does not exist

像OP一样,manage.py migrate和runserver都没有问题。我们还确认了Django可以创建和删除测试数据库,所以PostgreSQL数据库配置和访问权限都没问题。
问题出现在Django尝试在syncdb阶段创建测试数据库表时,因为Django首先会为没有迁移的模型创建表:在我们的情况下,一个没有迁移的模型实际上依赖于ContentType模型,而这个模型需要进行迁移。
一个解决方法是为仅用于测试的模型创建迁移,例如如此处所述。
我还不确定为什么在使用SQLite时不会出现这个错误。

(Django 3.2,psycopg2 2.8,PostgreSQL 12)


0
这也可能意味着数据库无法访问,假设我们覆盖DiscoverTestRunner类的setup_database方法,我们将遇到相同的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接