Python中如何在Django项目中复用其他项目的auth_user数据表

现在数据库里面已经有 auth_user 表了,请问新的 Django 项目怎样复用这张表的数据啊


Python中如何在Django项目中复用其他项目的auth_user数据表
3 回复

在Django里复用其他项目的auth_user表,核心是配置数据库路由和模型映射。假设你的两个Django项目(项目A和项目B)都连同一个数据库,并且项目B想用项目A的auth_user表。

第一步:在项目B的settings.py中配置数据库

确保项目B的数据库设置指向项目A使用的同一个数据库。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',  # 或其他数据库后端
        'NAME': 'your_shared_database_name',
        'USER': 'your_db_user',
        'PASSWORD': 'your_db_password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

第二步:在项目B中创建对应的模型

在项目B的某个app(比如shared_auth)的models.py里,定义一个与项目A的auth_user表结构完全一致的模型,并指定数据库表名。

from django.contrib.auth.models import AbstractUser
from django.db import models

class SharedUser(AbstractUser):
    # 这里不需要添加任何字段,因为表结构已经存在。
    # 关键是使用Meta类指定正确的数据库表名。
    class Meta:
        db_table = 'auth_user'  # 指定表名为项目A使用的auth_user表
        managed = False  # 非常重要!告诉Django不要管理这个表的创建和修改

第三步:在项目B的settings.py中指定用户模型

告诉Django项目B使用我们自定义的SharedUser模型作为默认的用户模型。

AUTH_USER_MODEL = 'shared_auth.SharedUser'

第四步:处理数据库路由(可选但推荐)

如果你的项目B除了auth_user表还想使用项目A的其他表,或者有自己独立的表,就需要配置数据库路由来避免迁移冲突。在项目B的settings.py中:

DATABASE_ROUTERS = ['path.to.your.SharedAuthRouter']

然后创建这个路由文件(例如routers.py):

class SharedAuthRouter:
    """
    将针对SharedUser模型(即auth_user表)的操作路由到'default'数据库。
    """
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'shared_auth':
            return 'default'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'shared_auth':
            return 'default'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        # 允许涉及shared_auth的关联关系
        if obj1._meta.app_label == 'shared_auth' or obj2._meta.app_label == 'shared_auth':
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # 禁止对shared_auth应用进行迁移
        if app_label == 'shared_auth':
            return False
        return None

关键点总结:

  1. 数据库连接:两个项目必须连接到同一个物理数据库。
  2. 模型定义:在复用方(项目B)定义模型,使用db_table精确指向被复用的表名,并设置managed = False
  3. 用户模型设置:通过AUTH_USER_MODEL让Django知道使用哪个模型。
  4. 使用数据库路由:这是最佳实践,它能清晰地管理哪些模型属于哪个“逻辑”项目,并防止对共享表执行迁移命令。

一句话建议: 通过定义managed=False的模型并正确设置AUTH_USER_MODEL来复用现有用户表。


models.OneToOne 这样似乎也可以

回到顶部