代码之家  ›  专栏  ›  技术社区  ›  Ishan Khare

将django的auth\u用户与现有用户表合并

  •  3
  • Ishan Khare  · 技术社区  · 7 年前

    目前,我有一个旧的应用程序,它是指一个 user 包含所有自定义字段的表。由于有大量的遗留代码引用该表,我不能简单地将该表重命名为 auth_user auth\u用户 .

    下面是 使用者

    +-------------------+--------------+------+-----+---------+----------------+
    | Field             | Type         | Null | Key | Default | Extra          |
    +-------------------+--------------+------+-----+---------+----------------+
    | user_id           | int(10)      | NO   | PRI | NULL    | auto_increment |
    | name              | varchar(100) | NO   |     | NULL    |                |
    | address           | varchar(100) | NO   |     | NULL    |                |
    | phone_no          | varchar(15)  | NO   |     | NULL    |                |
    | city              | varchar(100) | NO   |     | NULL    |                |
    | state             | varchar(100) | NO   |     | NULL    |                |
    | pin_no            | int(10)      | NO   |     | NULL    |                |
    | type              | varchar(100) | NO   |     | NULL    |                |
    | email             | varchar(100) | NO   |     | NULL    |                |
    | password          | varchar(100) | NO   |     | NULL    |                |
    | is_active         | tinyint(1)   | NO   |     | NULL    |                |
    | role              | varchar(40)  | NO   |     | NULL    |                |
    | creation_date     | int(100)     | NO   |     | NULL    |                |
    | edit_date         | int(100)     | NO   |     | NULL    |                |
    | country           | varchar(255) | NO   |     | NULL    |                |
    | district          | varchar(255) | NO   |     | NULL    |                |
    | ip                | varchar(255) | NO   |     | NULL    |                |
    | added_by          | int(11)      | NO   |     | NULL    |                |
    | is_phone_verified | binary(1)    | NO   |     | 0       |                |
    | remember_token    | varchar(100) | YES  |     | NULL    |                |
    | disclaimer_agreed | int(11)      | YES  |     | 0       |                |
    | mobile_login      | tinyint(4)   | NO   |     | 0       |                |
    +-------------------+--------------+------+-----+---------+----------------+
    

    和django的 auth\u用户 表:

    +--------------+--------------+------+-----+---------+----------------+
    | Field        | Type         | Null | Key | Default | Extra          |
    +--------------+--------------+------+-----+---------+----------------+
    | id           | int(11)      | NO   | PRI | NULL    | auto_increment |
    | password     | varchar(128) | NO   |     | NULL    |                |
    | last_login   | datetime(6)  | YES  |     | NULL    |                |
    | is_superuser | tinyint(1)   | NO   |     | NULL    |                |
    | username     | varchar(150) | NO   | UNI | NULL    |                |
    | first_name   | varchar(30)  | NO   |     | NULL    |                |
    | last_name    | varchar(30)  | NO   |     | NULL    |                |
    | email        | varchar(254) | NO   |     | NULL    |                |
    | is_staff     | tinyint(1)   | NO   |     | NULL    |                |
    | is_active    | tinyint(1)   | NO   |     | NULL    |                |
    | date_joined  | datetime(6)  | NO   |     | NULL    |                |
    +--------------+--------------+------+-----+---------+----------------+
    

    contrib.auth

    +-------------------+--------------+------+-----+---------+----------------+
    | Field             | Type         | Null | Key | Default | Extra          |
    +-------------------+--------------+------+-----+---------+----------------+
    | user_id           | int(10)      | NO   | PRI | NULL    | auto_increment |
    | name              | varchar(100) | NO   |     | NULL    |                |
    | address           | varchar(100) | NO   |     | NULL    |                |
    | phone_no          | varchar(15)  | NO   |     | NULL    |                |
    | city              | varchar(100) | NO   |     | NULL    |                |
    | state             | varchar(100) | NO   |     | NULL    |                |
    | pin_no            | int(10)      | NO   |     | NULL    |                |
    | type              | varchar(100) | NO   |     | NULL    |                |
    | email             | varchar(100) | NO   |     | NULL    |                |
    | password          | varchar(100) | NO   |     | NULL    |                |
    | is_active         | tinyint(1)   | NO   |     | NULL    |                |
    | role              | varchar(40)  | NO   |     | NULL    |                |
    | creation_date     | int(100)     | NO   |     | NULL    |                |
    | edit_date         | int(100)     | NO   |     | NULL    |                |
    | country           | varchar(255) | NO   |     | NULL    |                |
    | district          | varchar(255) | NO   |     | NULL    |                |
    | ip                | varchar(255) | NO   |     | NULL    |                |
    | added_by          | int(11)      | NO   |     | NULL    |                |
    | is_phone_verified | binary(1)    | NO   |     | 0       |                |
    | remember_token    | varchar(100) | YES  |     | NULL    |                |
    | disclaimer_agreed | int(11)      | YES  |     | 0       |                |
    | mobile_login      | tinyint(4)   | NO   |     | 0       |                |
    | last_login        | datetime(6)  | YES  |     | NULL    |                |
    | is_superuser      | tinyint(1)   | NO   |     | NULL    |                |
    | username          | varchar(150) | NO   | UNI | NULL    |                |
    | first_name        | varchar(30)  | NO   |     | NULL    |                |
    | last_name         | varchar(30)  | NO   |     | NULL    |                |
    | is_staff          | tinyint(1)   | NO   |     | NULL    |                |
    | is_active         | tinyint(1)   | NO   |     | NULL    |                |
    | date_joined       | datetime(6)  | NO   |     | NULL    |                |
    +-------------------+--------------+------+-----+---------+----------------+
    

    这里的动机是利用Django的内置 authentication permission

    How to Extend Django User Model ,但我不确定哪种方法是最好的,或者我应该做一些完全不同的事情

    2 回复  |  直到 7 年前
        1
  •  2
  •   Daniel Roseman    7 年前

    Django明确支持自定义用户模型。为现有表创建一个模型,使其从AbstractBaseUser继承,并设置 AUTH_USER_MODEL comprehensive docs .

        2
  •  0
  •   Tiago Peres damanpreet singh    4 年前

    Django ticket 如何从内置用户模型迁移到自定义用户模型。

    Carsten Fuchs

    • 您的项目还没有自定义用户模型。
    • 必须保留所有现有用户。
    • 仍然具有迁移文件的提交。这是相关的 这种方法的缺点。

    准备工作

    • 确保引用Django用户模型的任何第三方应用程序仅使用 generic referencing methods
    • 确保您自己的可重用应用程序(旨在供他人使用的应用程序)使用通用参考方法。
    • 我建议不要对你的项目应用程序做同样的事情:每个项目只切换到一个自定义用户模型一次,以后不再切换。它 from django.contrib.auth.models import User 其他(详细说明

    更新代码

    • ./manage.py startapp Accounts
      

    我选择了“账户”这个名字,但其他任何名字也适用。

    • Aymeric:创建与相同的自定义用户模型 auth.User ,叫它 User (如此多对多的表保持相同的名称)并设置 db_table='auth_user' Accounts/models.py :

      from django.contrib.auth.models import AbstractUser
      from django.db import models
      
      
      class User(AbstractUser):
      class Meta:
              db_table = 'auth_user'
      
    • 在里面 settings.py INSTALLED_APPS 并更新 AUTH_USER_MODEL

      INSTALLED_APPS = (
          # ...
          'Accounts',
      )
      
      AUTH_USER_MODEL = 'Accounts.User'
      
    • 在项目代码中,替换Django用户模型的所有导入:

      from django.contrib.auth.models import User with the new, custom one:
      

      来自帐户。模型导入用户

    • 删除所有旧迁移。(事先,看看是否 comment 14 与您相关!)例如,在项目根目录中:

      find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
      find . -path "*/migrations/*.pyc" -delete
      
    • ./manage.py makemigrations
      
    • 因此,稍后仍可以查看详细信息。)

    注意,我们已经完成了,只是新的迁移文件不匹配 django_migrations

    (此时甚至有可能为您的项目提供服务:它是 在数据库实际更改之前很容易退出。 做 如果您知道您甚至不能触摸迁移,那么这就是问题所在

    更新数据库

    • 截断django_迁移表。MySQL 8示例:

        TRUNCATE TABLE django_migrations;
      

    这可能与其他数据库或MySQL版本有所不同<

    • 假应用新的迁移集 ./管理py迁移--假

    • 检查内容类型,如中所述 comment 12

    结论

    • 到自定义用户模型的升级现已完成。您可以对该模型进行更改,并为其生成和应用迁移,就像
    • db_table 并生成和应用生成的迁移。