Python DJANGO在保存时添加NULL-整数错误位于/******/(1048,“***”和“x27”不能为NULL)

Python DJANGO在保存时添加NULL-整数错误位于/******/(1048,“***”和“x27”不能为NULL),python,mysql,sql,django,Python,Mysql,Sql,Django,我试图使用Django的save函数保存实体调用“Persona”的记录,但当我尝试插入新对象时,我得到了一个1048 IntegrityError,因为出于任何原因,Django正在一个不能为NULL且为外键的字段上添加NULL(该字段是慷慨ID,是表慷慨的外键),即使我正确地传递了值,在insert语句中也会发生这种情况。 奇怪的是,我在“慷慨”表上有值,并且我正确地捕获了在POST上传递的值,即使我打印了值,我也得到了传递的值,但是出于任何奇怪的原因,DJango在慷慨ID字段上添加了Nu

我试图使用Django的save函数保存实体调用“Persona”的记录,但当我尝试插入新对象时,我得到了一个1048 IntegrityError,因为出于任何原因,Django正在一个不能为NULL且为外键的字段上添加NULL(该字段是慷慨ID,是表慷慨的外键),即使我正确地传递了值,在insert语句中也会发生这种情况。 奇怪的是,我在“慷慨”表上有值,并且我正确地捕获了在POST上传递的值,即使我打印了值,我也得到了传递的值,但是出于任何奇怪的原因,DJango在慷慨ID字段上添加了Null

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

模型慷慨

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'
模型人物

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” 正在启动开发服务器 使用CONTROL-C退出服务器

慷慨的对象

Pais:Pais对象

{'sql':“插入到
Persona
Nombre
Apellido1
Apellido2
numeriodentification
observationes
FechaNacimiento
DireccionFoto
慷慨的
PaisID
LugarNacimiento
DireccionID
abajo
)值('ANDREW','FONSECA','RIVAS','NULL','NULL','NULL','NULL','NULL','time','0.000'} [28/Jun/2015 17:26:13]“POST/guardarpersona/HTTP/1.1”200 8

错误:

完整性/担保人角色/ (1048,“列'granoid'不能为空”)

此外,这里还有一个文件夹,其中有一些关于我的模型、view.py、已生成的SQL语句和错误的图片:

你知道我做错了什么吗?我是Django的新手,希望得到帮助和建议。

改变

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

将null更改为“True”会通知django此字段(慷慨)可以保留为null。因此,不会出现完整性错误

不要忘记迁移。

编辑

我重读了你的问题,我想我知道出了什么问题。你停止设置属性:

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'] 
保存前,将这些属性更改为
角色上的属性:

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()
如果对象不是“无”,则应保存


原件:

看起来您的ForeignKey是不可为空的ForeignKey:

genero = models.ForeignKey(Genero, db_column='GeneroID',null=False)
如果将此更改为:

genero = models.ForeignKey(Genero, db_column='GeneroID',null=True)
那么它是可以为空的

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

您是否使用Django(带或不带South)来设置表(
syncdb
migrate
)?如果是,则在进行此编辑后必须运行迁移

如果不是,则需要发出适当的sequel语句,以使该列在数据库中为空

警告1:不要在不进行测试的情况下简单地运行以下程序

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

如果您的应用程序不依赖于South或Django迁移,并且您(或过去有人)手动整理了表,那么您需要发出SQL语句来修改表,以便在此处接受可为NULL的值

执行此操作的SQL通常如下所示:

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

此外,看起来您正在为上面的许多字段传递
NULL
值,并且模型定义中的任何内容都不可为NULL,因此您必须为每个定期为空的字段重复此练习,或者您可以将
CharField
定义为包含
blank=True
并传递空st响铃。

你能多发布一点堆栈跟踪吗?当然!我又添加了几行!我想你的意思是“不要忘记迁移”。非常感谢你的回答@erewok,事实上这就是问题所在。我相信我以前没有看到过这一点!
ALTER TABLE `db_name`.`appname_persona`
MODIFY COLUMN `GeneroID` int(11) DEFAULT NULL;