运行 测试时 Django 关系不存在
Django relation does not exist when running test
我正在使用 Django 2.2.3
和 Postgres。
我正在尝试将测试添加到项目中,并且在执行 python ./manage.py test
或 python ./manage.py test app_name
时,在测试数据库创建步骤中不断 运行 出现错误 django.db.utils.ProgrammingError: relation "auth_group" does not exist
.
首先,我的建议 是我把我的数据库模式弄乱了一点——前段时间开发团队被要求从另一个数据库导入几个表,我'我们是通过使用 pgsql 直接导入来完成的。比我使用 python manage.py inspectdb
创建模型并将它们放入单独的应用程序中。
该命令创建了一个初始迁移,看起来像这样:
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name='SomeModelName',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
('some_other_field)', models.CharField(max_length=254, unique=True)),
],
options={'db_table': 'some_existing_table_name', 'managed': False,},
),
一切正常,因为我已经创建并应用了几次迁移,没有任何问题。但现在我被那个测试问题困住了。
经过简短调查后,我发现 inspectdb
还为某些身份验证表创建了模型,并且它们存在于 models.py 具有旧表的应用程序中。因此,以下几行出现在所讨论的应用程序的初始迁移中:
migrations.CreateModel(
name='AuthGroup',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
('name', models.CharField(max_length=80, unique=True)),
],
options={'db_table': 'auth_group', 'managed': False,},
),
并在 models.py 中:
class AuthGroup(models.Model):
name = models.CharField(unique=True, max_length=80)
class Meta:
managed = False
db_table = 'auth_group'
我认为这可能与某个问题有关,但我已尝试从 INSTALLED_APPS
中删除该应用程序,完全删除该应用程序,但没有任何效果。我在 运行 测试
时仍然遇到这些错误
有什么想法吗?我该怎么做才能解决这个问题?
也许,这种行为是由其他原因引起的?
P.S.这个问题与南方包的问题无关,因为它没有在这个项目中使用。
谢谢。
P.P.S. INSTALLED_APPS
:
INSTALLED_APPS = (
[
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
]
+ PROJECT_APPS
+ THIRD_PARTY_APPS
)
我发现这个问题在某种程度上与自定义用户模型有关,该模型是通过以下方式声明的:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
class Meta:
db_table = 'auth_user'
事实证明,用默认的 Django 用户替换它可以解决问题。
我正在使用 Django 2.2.3
和 Postgres。
我正在尝试将测试添加到项目中,并且在执行 python ./manage.py test
或 python ./manage.py test app_name
时,在测试数据库创建步骤中不断 运行 出现错误 django.db.utils.ProgrammingError: relation "auth_group" does not exist
.
首先,我的建议 是我把我的数据库模式弄乱了一点——前段时间开发团队被要求从另一个数据库导入几个表,我'我们是通过使用 pgsql 直接导入来完成的。比我使用 python manage.py inspectdb
创建模型并将它们放入单独的应用程序中。
该命令创建了一个初始迁移,看起来像这样:
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name='SomeModelName',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
('some_other_field)', models.CharField(max_length=254, unique=True)),
],
options={'db_table': 'some_existing_table_name', 'managed': False,},
),
一切正常,因为我已经创建并应用了几次迁移,没有任何问题。但现在我被那个测试问题困住了。
经过简短调查后,我发现 inspectdb
还为某些身份验证表创建了模型,并且它们存在于 models.py 具有旧表的应用程序中。因此,以下几行出现在所讨论的应用程序的初始迁移中:
migrations.CreateModel(
name='AuthGroup',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
('name', models.CharField(max_length=80, unique=True)),
],
options={'db_table': 'auth_group', 'managed': False,},
),
并在 models.py 中:
class AuthGroup(models.Model):
name = models.CharField(unique=True, max_length=80)
class Meta:
managed = False
db_table = 'auth_group'
我认为这可能与某个问题有关,但我已尝试从 INSTALLED_APPS
中删除该应用程序,完全删除该应用程序,但没有任何效果。我在 运行 测试
有什么想法吗?我该怎么做才能解决这个问题? 也许,这种行为是由其他原因引起的?
P.S.这个问题与南方包的问题无关,因为它没有在这个项目中使用。
谢谢。
P.P.S. INSTALLED_APPS
:
INSTALLED_APPS = (
[
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
]
+ PROJECT_APPS
+ THIRD_PARTY_APPS
)
我发现这个问题在某种程度上与自定义用户模型有关,该模型是通过以下方式声明的:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
class Meta:
db_table = 'auth_user'
事实证明,用默认的 Django 用户替换它可以解决问题。