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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:09:54