在使用Postgresql数据库的Django项目上运行createsuperuser
时,我遇到了django.db.utils.ProgrammingError: relation "user" does not exist
错误。在
我编写了下面的数据库路由器来指示表user
(它基于AbstractUser
类的自定义扩展)在模式users
中。即便如此,Django还是找不到它。在
from myapp.models import Class1, Class2, Class3
from users.models import User
from django.contrib.admin.models import LogEntry
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
# Include here classes (i.e. tables) that belongs to the "myapp" schema
ROUTED_MODELS_MYAPP = [Class1, Class2, Class3]
# Include here classes (i.e. tables) that belongs to the "users" schema
ROUTED_MODELS_USERS = [User, LogEntry, ContentType, Session] #classes for custom user model, and django tables `django_admin_log`, `django_content_type`, `django_session` tables
# classes for the following table names still missing from list: `auth_group`, `auth_group_permissions`, `auth_permission`.
class MyDBRouter(object):
"""
A router to place DB queries into correct schema depending on considered tables.
Sources:
https://stackoverflow.com/a/51007441/3976696
https://www.amvtek.com/blog/posts/2014/Jun/13/accessing-multiple-postgres-schemas-from-django/
"""
def db_for_read(self, model, **hints):
if model in ROUTED_MODELS_MYAPP:
return 'myapp'
elif model in ROUTED_MODELS_USERS:
return 'users'
return None
def db_for_write(self, model, **hints):
if model in ROUTED_MODELS_MYAPP:
return 'myapp'
elif model in ROUTED_MODELS_USERS:
return 'users'
return None
路由器适用于与身份验证无关的其他表,因此我怀疑这与我第一次迁移用户类时由Django自动创建的其他表有关(auth_group
,auth_group_permissions
,auth_permission
,django_admin_log
,django_content_type
,django_session
)。在
但是,我不确定:
if
/elif
)-->;有没有更好的方法为多个模式编写路由器?在django/contrib
目录,我能够猜出最后三个类名(django_admin_log
,django_content_type
,django_session
),但是我该如何找到auth_group
,auth_group_permissions
,auth_permission
的类名呢?在编辑:根据@Kevin的评论,我尝试基于app_label
s而不是文档中显示的型号名称来编写路由器,为每个相关的应用程序制作一个路由器。我还尝试在用户类的元类中手动指定app_label
(即app_label = 'users'
)。在
但是,当我在createsuperuser
中输入用户名时,原始错误(django.db.utils.ProgrammingError: relation "user" does not exist
)仍然存在。在路由器里我还能怎么处理这种情况呢?在
然后,我按以下顺序从settings.py
调用它们:
DATABASE_ROUTERS = (
'urbio.dbrouters.AdminRouter',
'urbio.dbrouters.AuthRouter',
'urbio.dbrouters.ContentTypeRouter',
'urbio.dbrouters.SessionRouter',
'urbio.dbrouters.UsersRouter',
)
解决方案是在运行
createsuperuser
命令时指定database
标志并指向正确的模式:另外,在this answer之后,
^{pr2}$settings.py
中的数据库定义是:相关问题 更多 >
编程相关推荐