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

如何以最小代价在Django用户模型中不使用int4作为主键?

Django用户模型替换UUID主键的标准实现方案

问题根源

你碰到的两个核心问题:

  • createsuperuser报错是因为仅定义了UUID主键,但未配置自动生成规则,导致创建用户时id字段为空,触发PostgreSQL非空约束。
  • Admin后台异常是因为未正确将自定义User模型与Django原生的UserAdmin关联注册。

无需自定义认证后端的标准解法

完全可以保留Django原生认证脚手架(包括Admin、createsuperuser等),只需按以下步骤调整:

1. 修正自定义User模型

给UUID字段添加自动生成逻辑,确保Django创建用户时自动填充主键:

import uuid
from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  • default=uuid.uuid4:指定默认值为自动生成的UUID
  • editable=False:禁止在Admin后台手动修改该字段

2. 配置Admin后台支持

在应用的admin.py中注册自定义模型并继承原生UserAdmin,保证Admin功能完整:

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

admin.site.register(User, UserAdmin)

3. 全局指定自定义用户模型

在项目settings.py中添加配置,告诉Django使用你的自定义模型作为认证用户模型:

AUTH_USER_MODEL = "users.User"  # 替换为你的应用名.模型名,比如"accounts.User"

重要注意事项

  • 必须在项目初始化阶段就设置AUTH_USER_MODEL,如果已经执行过迁移,需要清空数据库、删除应用migrations目录下除__init__.py外的所有文件,再重新执行迁移命令。
  • 该方案完全复用Django原生认证系统,不需要自定义认证后端,所有原生认证功能(登录、权限、createsuperuser等)均能正常使用。
  • 若要从已有的int主键用户模型迁移到UUID,需编写自定义数据迁移脚本,为现有用户批量生成UUID值,避免数据丢失。

验证操作

修改完成后,重新执行以下命令:

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

此时可正常创建超级用户,Admin后台也能正常管理用户数据。

内容的提问来源于stack exchange,提问作者jzw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:07:18