💖 作者:大家好,我是Clyde😜
🎉 支持我:点赞👍收藏⭐️留言📝
😇 GitHub主页:Tengxu666 Python是一门很神奇的语言, 还在学习
💻 DRF开源教程:drf_pro 更全面的Django Rest Framework 教程
欢迎star 🌟
重写DjangoUser表
Django框架在你第一次进行数据库迁移的时候会默认给你生成User表
当然你也可以选择继承默认User表来创建拥有自己专属字段的User表(必须是在第一次迁移之前⚠️)
例如:
创建User类并继承Django中的AbstractUser
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
username = models.CharField(max_length=255, unique=True)
email = models.EmailField(max_length=255, unique=True)
telephone = models.CharField(max_length=11, unique=True, null=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ["username"]
objects = UserManager()
def __str__(self):
return self.email
class Meta:
db_table = "user"
其中
USERNAME_FIELD
指定的是您要将那个字段设置为账号,默认为usernameREQUIRED_FIELDS
指定的是在您使用createsuperuser命令时,需要额外输入的字段str
方法指定了User.objects.get方法查到指定user对象后返回的内容db_table
指定了数据库中存储的表名称
当您更改USERNAME_FIELD
后,需要重新设置UserManager
,如下所示
from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
def create_user(self, username, email, password=None):
if username is None:
raise TypeError('用户应该有一个用户名')
if email is None:
raise TypeError('用户应该有一个电子邮件')
user = self.model(username=username, email=self.normalize_email(email))
user.set_password(password)
user.save()
return user
def create_superuser(self, username, email, password=None):
if password is None:
raise TypeError('密码不应该是None')
user = self.create_user(username, email, password)
user.is_superuser = True
user.is_staff = True
user.save()
return
因为我的User表中,设置的USERNAME_FIELD
字段为email,username同样是必填项,所以在重写create_user
和create_superuser
时,需要得到username, email, password三个字段的数据。
当重构完User表后,你必须在setting.py中指定它
# 自定义用户模型
AUTH_USER_MODEL = 'authentication.User'
至此 可进行第一次数据库迁移 ✌️ ✌️
你需要完整的运行makemigrations
和migrate
如果像平时新的项目一样只运行migrate
时,可能会发生数据库的关联外建错误,是因为你的User表没有被create
🎉 支持我:点赞👍收藏⭐️留言📝
📣 系列专栏:DjangoRestFramework🍁