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

Django创建用户时cargo_empleado外键赋值错误求助

问题:Django创建用户时外键cargo_empleado赋值报错

我正在通过存储过程在Django中创建用户,但外键cargo_empleado出现错误,错误提示:

Cannot assign "'funcionario'": "Empleado.cargo_empleado" must be a "CargoEmpleado" instance

以下是我的相关代码:

models.py

class CargoEmpleado(models.Model):
    nombre_cargo = models.CharField(max_length=50, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Cargo_empleado'

class Empleado(models.Model):
    rut = models.CharField(primary_key=True, max_length=9)
    nombres = models.CharField(max_length=100, blank=True, null=True)
    apellidos = models.CharField(max_length=100, blank=True, null=True)
    correo_electronico = models.CharField(max_length=100, blank=True, null=True)
    usuario = models.CharField(max_length=50, blank=True, null=True)
    contrasena = models.CharField(max_length=255, blank=True, null=True)
    activo = models.IntegerField()
    cargo_empleado = models.ForeignKey(CargoEmpleado, models.DO_NOTHING, db_column='cargo_empleado')
    id_empresa = models.ForeignKey('Empresa', models.DO_NOTHING, db_column='id_empresa', blank=True, null=True)
    id_unida = models.ForeignKey('UnidadInterna', models.DO_NOTHING, db_column='id_unida')

    class Meta:
        managed = False
        db_table = 'Empleado'

views.py

def crearusuario(request):
    if request.method=="POST":
        if request.POST.get('rut') and request.POST.get('nombres') and request.POST.get('apellidos') and request.POST.get('correo_electronico') and request.POST.get('usuario') and request.POST.get('contrasena') and request.POST.get('activo') and request.POST.get('cargo_empleado') and request.POST.get('id_empresa') and request.POST.get('id_unida'):
            usersave= Empleado()
            usersave.rut=request.POST.get('rut')
            usersave.nombres=request.POST.get('nombres')
            usersave.apellidos=request.POST.get('apellidos')
            usersave.correo_electronico=request.POST.get('correo_electronico')
            usersave.usuario=request.POST.get('usuario')
            usersave.contrasena=request.POST.get('contrasena')
            usersave.activo=request.POST.get('activo')
            usersave.cargo_empleado=request.POST.get('cargo_empleado')
            usersave.id_empresa=request.POST.get('id_empresa')
            usersave.id_unida=request.POST.get('id_unida')
            cursor=connection.cursor()
            cursor.execute("call SP_crear_usuario('"+usersave.rut+"','"+usersave.nombres+"', '"+usersave.apellidos+"', '"+usersave.correo_electronico+"', '"+usersave.usuario+"', '"+usersave.contrasena+"', '"+usersave.activo+"', '"+usersave.cargo_empleado+"', '"+usersave.id_empresa+"', '"+usersave.id_unida+"')")
            messages.success(request, "El empleado "+usersave.nombres+" se guardo correctamente ")
            return render(request, 'app/crearusuario.html')
    else:
        return render(request, 'app/crearusuario.html')

解决方案

错误核心原因:你直接将POST传来的字符串(如'funcionario')赋值给外键字段cargo_empleado,但Django外键字段要求赋值的是对应模型的实例,或者实例的主键值。

1. 若前端传递的是CargoEmpleado的主键ID

直接通过_id后缀赋值(Django外键字段自动生成的主键赋值属性):

# 替换原代码中usersave.cargo_empleado的赋值行
usersave.cargo_empleado_id = request.POST.get('cargo_empleado')
# 同理,其他外键也按此方式修改
usersave.id_empresa_id = request.POST.get('id_empresa')
usersave.id_unida_id = request.POST.get('id_unida')

2. 若前端传递的是CargoEmpleado的nombre_cargo值

先查询对应的模型实例,再赋值:

from django.shortcuts import get_object_or_404

# 获取前端传来的职位名称
cargo_nombre = request.POST.get('cargo_empleado')
# 查询对应实例,不存在则返回404页面
cargo_instance = get_object_or_404(CargoEmpleado, nombre_cargo=cargo_nombre)
# 赋值给外键字段
usersave.cargo_empleado = cargo_instance

3. 修复SQL注入风险

当前直接拼接SQL语句的方式存在严重安全隐患,改用参数化查询:

cursor.execute(
    "call SP_crear_usuario(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
    [
        usersave.rut, usersave.nombres, usersave.apellidos,
        usersave.correo_electronico, usersave.usuario, usersave.contrasena,
        usersave.activo, usersave.cargo_empleado_id,
        usersave.id_empresa_id, usersave.id_unida_id
    ]
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:54:25