2015-06-28 36 views
0

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

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

模型的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' 

模型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对象

派斯:派斯对象

{ 'SQL':“INSERT INTO PersonaNombreApellido1Apellido2NumeroIdentificacionObservacionesFechaNacimientoDireccionFotoGeneroIDPaisIDLugarNacimientoDireccionID, ('ANDREW','FONSECA','RIVAS','','',NULL,'',NULL,NULL,'',NULL,'','','')“ ,'time':'0.000'} [28 /月/ 2015年17时26分13秒] “POST/guardarpersona/HTTP/1.1” 200 8

ERROR:在

IntegrityError/guardarpersona/ (1048,“列GeneroID'不能是空“)

而且,这里是我的模型,view.py一些照片的文件夹,已生成的SQL语句和错误: https://www.dropbox.com/sh/wr3ve7cn9b0ofpm/AAD-57RXZGkxld74eCPhakERa?dl=0

什么我做错了任何想法?我是Django的新成员,希望能给予帮助和建议。

+0

你可以发布多一点你的堆栈跟踪? – NightShadeQueen

+0

当然!我加了几条线! – Salas

回答

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,那么它应该保存。


ORIGINAL:

它看起来像你的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),用它来代替以下!

如果你的应用程序不依赖于南或Django的迁移,并且你有(或者有人在过去)手动管理这些表,那么你将需要发出SQL语句来修改表以接受NULL这里有价值。

的SQL这样做通常看起来东西类似如下:

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

此外,它看起来像你逝去的NULL值在许多领域那里并没有什么模型定义是无效的,所以你将不得不重复这个练习每个你期望经常为空的字段或者你可以将你的CharField定义为包括blank=True并传入空字符串。

+0

非常感谢您的回答@erewok其实这是问题所在。我可以相信我以前没有看到过! – Salas

0

变化

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

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

更改空为 “True” 通知Django的这个领域(的Genero)可以保留为空。因此,没有完整性错误。

不要忘记迁移。

+0

我不断收到相同的错误:/ @MaJi – Salas

+1

我认为你的意思是“不要忘记移民”。 – erewok

+0

尝试迁移您的新模型。它会工作 – kartikmaji

相关问题