自定义用户类和Postgresql架构的Django“关系不存在”错误

2024-10-02 02:45:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用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_groupauth_group_permissionsauth_permissiondjango_admin_logdjango_content_typedjango_session)。在

但是,我不确定:

  1. 如果路由器应该像我一样写(一系列 if/elif)-->;有没有更好的方法为多个模式编写路由器?在
  2. 对应于 上面列出的Django表。-->;通过查看django/contrib目录,我能够猜出最后三个类名(django_admin_logdjango_content_typedjango_session),但是我该如何找到auth_groupauth_group_permissionsauth_permission的类名呢?在

编辑:根据@Kevin的评论,我尝试基于app_labels而不是文档中显示的型号名称来编写路由器,为每个相关的应用程序制作一个路由器。我还尝试在用户类的元类中手动指定app_label(即app_label = 'users')。在

但是,当我在createsuperuser中输入用户名时,原始错误(django.db.utils.ProgrammingError: relation "user" does not exist)仍然存在。在路由器里我还能怎么处理这种情况呢?在

^{pr2}$

然后,我按以下顺序从settings.py调用它们:

DATABASE_ROUTERS = (
                    'urbio.dbrouters.AdminRouter',
                    'urbio.dbrouters.AuthRouter', 
                    'urbio.dbrouters.ContentTypeRouter', 
                    'urbio.dbrouters.SessionRouter', 
                    'urbio.dbrouters.UsersRouter',
                    )

Tags: djangofromimportauthtablesmodelreturnmodels
1条回答
网友
1楼 · 发布于 2024-10-02 02:45:04

解决方案是在运行createsuperuser命令时指定 database标志并指向正确的模式:

python manage.py createsuperuser  database users

另外,在this answer之后,settings.py中的数据库定义是:

^{pr2}$

相关问题 更多 >

    热门问题