如何在自定义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
相关产品推荐
相关产品推荐

