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
相关产品推荐
相关产品推荐

