您的位置:首页 > 编程语言 > Go语言

自学django中重写User模型(笔记)

2019-01-04 17:18 781 查看

django框架自带了User模型,有时候不一定适用,需要重构,再此做个笔记,留作以后备用。

        既然重构User模型,首先肯定要重写User模型代码了。

        '''
        #encoding: utf-8
        from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
        from shortuuidfield import ShortUUIDField
        from django.db import models

        # 不使用默认的自增长的主键,使用shortuuid,唯一。
        # pip install django-shortuuidfield

        
        class UserManger(BaseUserManager):

            #  写此方法为了精简代码,下面创建普通用户跟超级用户都会调用此方法
            def _create_user(self,telephone,username,password,**kwargs):

                if not telephone:
                    raise ValueError('请输入手机号码!')
                if not username:
                    raise ValueError('请输入用户名!')
                if not password:
                    raise ValueError('请输入密码!')
                #  self.model 表示User
                user = self.model(telephone=telephone,username=username,**kwargs)
                user.set_password(password)
                user.save()
                return user

                # 创建普通用户
            def create_user(self,telephone,username,password,**kwargs):

                kwargs['is_superuser'] = False
                return self._create_user(telephone,username,password,**kwargs)

                # 创建超级用户
            def create_superuser(self,telephone,username,password,**kwargs):

                kwargs['is_superuser'] = True
                return self._create_user(telephone,username,password,**kwargs)


        class User(AbstractBaseUser, PermissionsMixin):

            uid = ShortUUIDField(primary_key=True)  # 设置为主键
            telephone = models.CharField(max_length=11, unique=True) 
            username = models.CharField(max_length=100) 
            email = models.EmailField(unique=True)
            is_active = models.BooleanField(default=True)  # 是否是可用的
            is_staff = models.BooleanField(default=False)  # 是否是员工
            data_joined = models.DateTimeField(auto_now_add=True)  # 加入时间

            USERNAME_FIELD = 'telephone'  # 作为唯一认证标识, 如果不重写User模型则默认username
            REQUIRED_FIELDS = ['username']  # 设置此属性会提示 username,telephone,password
            EMAIL_FIELD = 'email'  # 给指定用户发送邮件

            objects = UserManger()

            def get_full_name(self):  # 必须定义。 long格式的用户标识。
                return self.username

            def get_short_name(self):  # 必须定义。 short格式的用户标识。
                return self.username
            '''

如果使用mysql数据库,不使用django自带的轻量数据库,就得在settings.py中配置数据库了
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',
                    'NAME': 'appname',
                    'HOST': '127.0.0.1',
                    'PORT': '3306',
                    'USER': 'root',
                    'PASSWORD': 'password',
                }
            }

如果包含有models.py的应用没有在settings.py中的INSTALLED_APPS 添加,记得得添加

然后在settings.py中继续添加下面这行代码,覆盖默认的User模型。
            AUTH_USER_MODEL = 'appname.User'  # User前面的名称为User模型所在models.py的应用名称

接下来就是在虚拟环境下运行 python manage.py makemigrations ,在当前应用文件夹下有一个
migrations文件夹,里面会生成一个 0001_initial.py,保存了第一次数据迁移工作,也就是创建了User模型。

然后 运行 python manage.py migrate 此时才会在Mysql数据库中真实创建了数据表。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: