DJANGO在保存时添加NULL - / **** /时的IntegrityError(1048,“***'不能为空”)

时间:2015-06-28 17:13:35

标签: python mysql sql django

我正在尝试使用Django的保存函数保存实体调用'Persona'的记录,但是当我尝试插入新对象时,我得到了1048 IntegrityError,因为Django因为任何原因在一个不能的字段上添加NULL null并且是外键(该字段是GeneroID,它是表Genero的外键),这在插入语句期间,即使我正确传递值也是如此。 奇怪的是,我在'Genero'表上有值,并且我正确捕获POST上传递的值,即使我打印了值我传递的值,但是由于任何奇怪的原因,DJango在GeneroID字段上添加了Null。 / p>

我在InnoDB和Django 1.8上使用MySQL。我的模型是从遗留数据库中生成的。

MODEL GENERO

class Genero(models.Model):
id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
genero = models.CharField(db_column='Genero', max_length=50)  # Field name made lowercase.

class Meta:
    managed = False
    db_table = 'Genero'

MODEL PERSONA

class Persona(models.Model):
id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
nombre = models.CharField(db_column='Nombre', max_length=50)  # Field name made lowercase.
apellido1 = models.CharField(db_column='Apellido1', max_length=50)  # Field name made lowercase.
apellido2 = models.CharField(db_column='Apellido2', max_length=50)  # Field name made lowercase.
numeroidentificacion = models.CharField(db_column='NumeroIdentificacion', unique=True, max_length=50)  # Field name made lowercase.
observaciones = models.CharField(db_column='Observaciones', max_length=255)  # Field name made lowercase.
fechanacimiento = models.DateField(db_column='FechaNacimiento')  # Field name made lowercase.
direccionfoto = models.CharField(db_column='DireccionFoto', max_length=500)  # Field name made lowercase.
genero = models.ForeignKey(Genero, db_column='GeneroID',null=False)  # Field name made lowercase.
pais = models.ForeignKey(Pais, db_column='PaisID')  # Field name made lowercase.
lugarnacimiento = models.CharField(db_column='LugarNacimiento', max_length=100)  # Field name made lowercase.
direccion = models.ForeignKey(Direccion, db_column='DireccionID')  # Field name made lowercase.
profesion = models.CharField(db_column='Profesion', max_length=200)  # Field name made lowercase.
puesto = models.CharField(db_column='Puesto', max_length=200)  # Field name made lowercase.
lugartrabajo = models.CharField(db_column='LugarTrabajo', max_length=100)  # Field name made lowercase.

class Meta:
    managed = False
    db_table = 'Persona'

VIEW.PY

def guardarpersona(request):
direccion = json.loads(request.POST['direccion[]'])
persona = json.loads(request.POST['persona[]'])
temp = Direccion()
temp.descripcion = direccion[1]['value']
temp.distrito = Distrito.objects.get(pk=direccion[0]['value'])
temp.save()

p = Persona()
p.nombre = persona[1]['value']
p.apellido1 = persona[2]['value']
p.apellido2 = persona[3]['value']
numeroidentificacion = persona[4]['value']
observaciones = persona[12]['value']
fechanacimiento = persona[6]['value']
direccionfoto = ''
genero = Genero.objects.get(pk=persona[5]['value'])
print(genero)
pais = Pais.objects.filter(id=persona[8]['value'])
print(pais)
lugarnacimiento = persona[7]['value']
direccion = temp
profesion = persona[9]['value']
puesto = persona[10]['value']
lugartrabajo = persona[11]['value'] 

try:
    p.save()
except Exception:
    from django.db import connection
    print (connection.queries[-1])
return HttpResponse('Success!')      

DJANGO SQL语句已生成:

系统检查发现没有问题(0静音)。 2015年6月28日 - 17:26:12 Django 1.8.2版,使用设置'WhiteKoala.settings' 在http://127.0.0.1:8000/启动开发服务器 使用CONTROL-C退出服务器。

Genero对象

Pais:Pais对象

{'sql':“INSERT INTO PersonaNombreApellido1Apellido2NumeroIdentificacionObservaciones,{{1 }},FechaNacimientoDireccionFotoGeneroIDPaisIDLugarNacimientoDireccionIDProfesionPuesto )VALUES('ANDREW','FONSECA','RIVAS','','',NULL,'',NULL,NULL,'',NULL,'','','')“,'time': '0.000'} [28 / Jun / 2015 17:26:13]“POST / guardarpersona / HTTP / 1.1”200 8

ERROR:

/ guardarpersona的IntegrityError / (1048,“列'GeneroID'不能为空”)

此外,这是一个文件夹,其中包含一些关于我的模型的图片,view.py,SQL语句已生成并且错误: https://www.dropbox.com/sh/wr3ve7cn9b0ofpm/AAD-57RXZGkxld74eCPhakERa?dl=0

对我做错了什么的想法?我是Django的新手,我很感激帮助和建议。

2 个答案:

答案 0 :(得分:0)

更改

genero = models.ForeignKey(Genero, db_column='GeneroID',null=False)

genero = models.ForeignKey(Genero, db_column='GeneroID',null=True)

将null更改为" True"通知django该字段(genero)可以保留为null。因此,没有完整性错误。

不要忘记迁移。

答案 1 :(得分:0)

修改

我重读了你的问题,我想我看到了什么问题。您已停止设置属性:

p = Persona()
p.nombre = persona[1]['value']
p.apellido1 = persona[2]['value']
p.apellido2 = persona[3]['value']

出于某种原因,您可以在此处停止设置属性:

numeroidentificacion = persona[4]['value']
observaciones = persona[12]['value']
fechanacimiento = persona[6]['value']
direccionfoto = ''
genero = Genero.objects.get(pk=persona[5]['value'])
print(genero)
pais = Pais.objects.get(id=persona[8]['value'])  # must `get` instead of `filter`
print(pais)
lugarnacimiento = persona[7]['value']
direccion = temp
profesion = persona[9]['value']
puesto = persona[10]['value']
lugartrabajo = persona[11]['value'] 

在保存前将这些属性更改为Persona上的属性:

p.numeroidentificacion = persona[4]['value']
p.observaciones = persona[12]['value']
p.fechanacimiento = persona[6]['value']
p.direccionfoto = ''
p.genero = Genero.objects.get(pk=persona[5]['value'])
p.pais = Pais.objects.get(id=persona[8]['value'])
p.lugarnacimiento = persona[7]['value']
p.direccion = temp
p.profesion = persona[9]['value']
p.puesto = persona[10]['value']
p.lugartrabajo = persona[11]['value'] 

之后,尝试保存它:

 p.save()

如果你的对象不是None,那么它应该保存。

原文:

看起来你的ForeignKey是一个不可为空的ForeignKey:

genero = models.ForeignKey(Genero, db_column='GeneroID',null=False)

如果您将其更改为:

genero = models.ForeignKey(Genero, db_column='GeneroID',null=True)

然后它可以为空。

但是,IntegrityError使得错误似乎在数据库级别,因此在模型定义中修复此错误并不能完全解决问题。 IntegrityError显示数据库实际上是在抛出错误,因此您必须查看表定义和约束。

您是否使用带或不带南的Django来设置表格(syncdbmigrate)?如果是这样,那么您必须在进行此编辑后运行迁移。

如果没有,那么你需要发出必要的续集声明,以便在数据库中使该列成为Nullable。

警告1:在没有测试的情况下不要简单地运行

警告2:如果您的应用程序依赖于迁移(南方或本地Django),请使用它而不是以下内容!

如果你的应用程序不依赖于South或Django迁移,并且你曾经(或曾经有人),手动策划表,那么你需要发出SQL语句来修改表以接受NULL这里的价值。

执行此操作的SQL 通常看起来某些,如下所示:

ALTER TABLE `db_name`.`appname_persona`
MODIFY COLUMN `GeneroID` int(11) DEFAULT NULL;

此外,看起来你正在为那里的许多字段传递NULL值,并且模型定义中没有任何内容是NULLABLE,所以你必须为你期望的每个字段重复这个练习定期为空,或者您可以将CharField定义为包含blank=True并传入空字符串。