Django中如何自定义User模型并添加额外字段
Django扩展内置User模型新增自定义字段的实现方法
Django扩展内置User模型有两种常用实现方案,按需选择即可:
方案1:继承AbstractUser(推荐新项目使用)
该方案直接替换Django内置的User模型,可自定义字段的灵活性最高,仅适用于还未执行过auth相关数据库迁移的新项目。- 编辑
models.py文件,代码如下:
from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): # 按需添加自定义字段,以下为示例 phone = models.CharField(max_length=11, blank=True, verbose_name="手机号") avatar = models.ImageField(upload_to="avatars/", blank=True, verbose_name="用户头像")- 在项目的
settings.py中添加配置,指定使用自定义用户模型:
# 替换为你的应用名.自定义用户类名 AUTH_USER_MODEL = "myapp.CustomUser"- 执行迁移命令生成表结构即可:
python manage.py makemigrations python manage.py migrate- 编辑
方案2:一对一关联Profile表(适合已有项目使用)
该方案不需要改动原有内置User表,无迁移冲突风险,适合已经执行过auth迁移、甚至已经上线的项目。- 编辑
models.py文件,代码如下:
from django.contrib.auth.models import User from django.db import models from django.db.models.signals import post_save from django.dispatch import receiver class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") # 按需添加自定义字段,以下为示例 phone = models.CharField(max_length=11, blank=True, verbose_name="手机号") avatar = models.ImageField(upload_to="avatars/", blank=True, verbose_name="用户头像") # 配置信号:创建User实例时自动生成关联的Profile实例 @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: UserProfile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): instance.profile.save()- 执行迁移命令生成Profile表结构即可,使用时通过
用户实例.profile.字段名即可访问自定义字段,示例:request.user.profile.phone。
- 编辑
注意:不要直接修改Django内置的User源码,以上两种是官方推荐的标准扩展方案,不会影响Django原有auth体系的功能使用。
内容的提问来源于stack exchange,提问作者Roham niazi
相关产品推荐
相关产品推荐

