Django自定义用户(UUID主键)删除时触发数据库编程错误求助
Django自定义UUID用户模型删除时出现ProgrammingError的解决方案
问题原因
你使用UUID作为CustomUser的主键,但Django默认的django_admin_log表中user_id字段是整数类型,删除用户时Django会尝试关联查询该表的记录,导致整数与UUID类型不匹配,触发operator does not exist: integer = uuid错误。
解决方案
1. 修改django_admin_log表的user_id字段类型
开发环境快速修复(直接操作数据库)
针对PostgreSQL执行以下SQL语句:
ALTER TABLE django_admin_log ALTER COLUMN user_id TYPE uuid USING user_id::uuid;
生产环境规范修复(使用Django迁移)
- 创建空迁移文件:
python manage.py makemigrations --empty your_app_name - 打开生成的迁移文件,替换内容为:
from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ # 替换为你的app最后一次迁移的名称,比如('your_app_name', '0005_last_migration') ] operations = [ migrations.AlterField( model_name='logentry', name='user', field=models.ForeignKey( on_delete=models.CASCADE, to='your_app_name.CustomUser', verbose_name='user' ), ), ] - 执行迁移:
python manage.py migrate
2. 优化删除逻辑(可选但推荐)
由于Employee和CustomUser是OneToOneField且设置了on_delete=models.CASCADE,删除Employee时会自动级联删除关联的CustomUser,不需要手动调用user.delete(),简化后的代码:
def destroy(self, request,pk, *args, **kwargs): employee = get_object_or_404(Employee, pk=pk) employee.delete() return Response( {"detail": "Employee and user deleted successfully."}, status=status.HTTP_204_NO_CONTENT )
3. 后续注意事项
- 自定义用户模型时,建议在项目初始化阶段就确定主键类型,避免后期修改表结构带来的风险。
- 所有关联用户模型的外键字段,类型必须与用户模型的主键类型保持一致。
内容的提问来源于stack exchange,提问作者Bipul
相关产品推荐
相关产品推荐

