You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义Django User模型生成随机唯一主键ID并在Admin展示

实现自定义User模型的唯一主键ID及Admin展示

一、修改User模型添加唯一主键ID

你可以选择两种常用的唯一ID类型,根据业务需求选择:

1. 使用UUID作为主键(推荐)

UUID能保证全局唯一性,适合分布式系统或需要避免ID泄露业务规模的场景。

先导入uuid模块,再在User类中添加主键字段(覆盖Django默认的自增ID):

import uuid
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager

# ... 保留CustomUserManager原有代码 ...

class User(AbstractBaseUser, PermissionsMixin):
    # 新增UUID主键,自动生成且不可编辑
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    email = models.EmailField(db_index=True, unique=True, max_length=254)
    first_name = models.CharField(max_length=240)
    last_name = models.CharField(max_length=255)
    mobile = models.CharField(max_length=50)
    address = models.CharField(max_length=250)

    is_staff = models.BooleanField(default=True) 
    is_active = models.BooleanField(default=True) 
    is_superuser = models.BooleanField(default=False) 

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name','last_name','mobile']

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

2. 使用自增整数作为主键

如果偏好传统自增ID,显式声明即可(Django默认会生成自增ID,但自定义User模型时显式声明更清晰):

class User(AbstractBaseUser, PermissionsMixin):
    id = models.AutoField(primary_key=True, editable=False)
    # ... 其余字段保持不变 ...

二、修复模型管理器的参数错误

你的create_user方法调用_create_user时多传了一个password参数,会导致参数不匹配报错,修正如下:

def create_user(self, email, password, first_name, last_name, mobile, **extra_fields):
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_active', True)
    extra_fields.setdefault('is_superuser', False)
    # 移除多余的password参数
    return self._create_user(email, password, first_name, last_name, mobile, **extra_fields)

三、执行数据库迁移

修改模型后,运行以下命令让数据库结构同步更新:

python manage.py makemigrations
python manage.py migrate

四、在Django Admin中展示唯一ID

需要自定义UserAdmin来显示新添加的主键字段,在项目的admin.py中添加以下代码:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .models import User

class UserAdmin(BaseUserAdmin):
    # 列表页显示的字段,新增id列
    list_display = ('id', 'email', 'first_name', 'last_name', 'mobile', 'is_staff', 'is_active')
    # 详情页的字段分组,将id放入基本信息组
    fieldsets = (
        ('基本信息', {'fields': ('id', 'email', 'password', 'first_name', 'last_name', 'mobile', 'address')}),
        ('权限设置', {'fields': ('is_staff', 'is_active', 'is_superuser', 'groups', 'user_permissions')}),
        ('重要日期', {'fields': ('last_login',)}),
    )
    # 新增用户时不显示id(自动生成)
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2', 'first_name', 'last_name', 'mobile', 'address', 'is_staff', 'is_active'),
        }),
    )

# 注册自定义的User模型和Admin配置
admin.site.register(User, UserAdmin)

配置完成后,Admin的用户列表页会显示唯一ID,详情页也会展示ID字段(因editable=False无法修改)。

内容的提问来源于stack exchange,提问作者Mohammad Touhidul Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:27:30