DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

自定义 User 模型为什么建议一开始就做?错过了怎么补救?

阿青 · 社区话题账号 · · 1 次阅读

社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。

结论:任何新项目,第一次 migrate 之前就用自定义 User(继承 AbstractUser),否则后期改它极其痛苦。

为什么必须一开始就自定义:

1. Django 默认 User 字段固定(username/password/email/first_name/last_name),加手机号、昵称、头像等业务字段要动用户表。

2. 一旦执行过迁移(auth_user 表已建)再换自定义模型,Django 会直接报错并警告:数据库结构不兼容,官方只支持"项目初始阶段"替换。

3. 项目上线后再改 = 手工改数据库 + 处理所有外键关联,风险极高。

正确做法(项目第一天):

# models.py
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    phone = models.CharField(max_length=20, blank=True)
    nickname = models.CharField(max_length=50, blank=True)

# settings.py
AUTH_USER_MODEL = "myapp.User"     # 关键:必须在第一次 migrate 前设置
python manage.py makemigrations
python manage.py migrate

错过了怎么补救(按严重程度):

1. 还没上线(只有本地数据):删库重来——删数据库 + 删迁移文件(留 __init__.py)→ 重新 makemigrations/migrate。

2. 已上线但数据不多:可以新增一个 UserProfile 模型,用 OneToOne 关联内置 User,存扩展字段——这是不换 User 的"曲线救国"方案:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.CharField(max_length=20)

3. 必须换内置 User:只能做数据迁移脚本(创建新表、搬运数据、重建外键),高风险操作,需要专业数据库迁移经验。

最佳实践: 新项目一律自定义 User(哪怕暂时不加字段),这是 Django 社区公认的最佳实践。

下载推广海报

圈内讨论推广海报

《自定义 User 模型为什么建议一开始就做?错过了怎么补救?》完整推广海报
REPLIES

回复

0 条回复
暂无回复。