扩展auth_user表

发布时间 2023-12-01 15:45:36作者: wellplayed

扩展auth_user表

方法一:

from django.contrib.auth.models import User


# 第一种: 建立一对一外键关系  (不推荐)
class UserDetail(models.Model):
    phone = models.BigIntegerField()
    user = models.OneToOneField(to='User')

 

方法二:

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


# 第二种:面向对象的继承
class UserInfo(AbstractUser):

    phone = models.BigIntegerField(verbose_name='用户手机号码')
    addr = models.CharField(max_length=255, verbose_name='家庭住址')

        """
    提示:
        如果继承了AbstractUser
        那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了
        而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段
        这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展

    继承的注意事项:
        1. 继承之前保证没有执行过数据库迁移命令
            保证auth_user没有被创建,如果当前库已经创建了那么你就重新换一个库
        2. 继承的类里面不要覆盖AbstractUser默认的的字段名
            表里面有的字段都不要动,只扩展额外字段即可
        3. 需要在settings.py配置文件中告诉django你要用UserInfo替代auth_user.
            AUTH_USER_MODEL = 'app01.UserInfo'
                              '应用名.表名'
            这句话的含义就类似于我们书写表类的完后, 执行完数据库迁移命令会生成的app01_userinfo这张表
    """

 

 

注意: auth模块的功能还是照常使用,参考的表页只是由原来的auth_user变成了UserInfo

    # 原来的:
    from django.contrib.auth.models import User
    User.objects.create_user(username=username, password=password)

    # 现在的:
    from app01.models import UserInfo
    UserInfo.objects.create_use

  

补充: 如果auth_user表已经创建了, 还想使用. 但是你在迁移数据库执行migrate命令的时候, 会抛出异常, 那么操作方法参考如下连接即可:

https://blog.csdn.net/cf313995/article/details/84342187

https://blog.csdn.net/github_38854366/article/details/81015647

 

# 扩展auth_user表
   注意事项:
   1. 在没执行过数据库迁移命令之前, 执行了就换库.
   2. 必须要继承AbstractUser类, 且自定义字段不能与其类里面冲突
   3. 还需要到配置文件中进行声明: AUTH_USER_MODEL = '应用名.表名'

   from django.db import models
   from django.contrib.auth.models AbstractUser
   class UserInfo(AbstractUser):
        phone = models.CharField(max_length=255)
        create_time = models.DateField(auto_now_add=True)

   使用方式换汤不换药:
   from app01.models import UserInfo
   User.objects.create_user(username=username, password=password, phone=phone)