gpt4 book ai didi

python - DJANGO 在保存时添加 NULL - IntegrityError at/****/(1048, "***' 不能为 null")

转载 作者:行者123 更新时间:2023-11-29 22:17:20 25 4
gpt4 key购买 nike

我正在尝试使用 Django 的保存功能保存实体调用“Persona”的记录,但是当我尝试插入新对象时,我收到 1048 IntegrityError,因为出于某种原因 Django 在无法插入的字段上添加 NULL null 且是外键(该字段是 GeneroID,它是表 Genero 的外键),即使我正确传递值,也会在插入语句期间出现此情况。奇怪的是,我在“Genero”表上有值,并且我正确捕获了 POST 上传递的值,即使我打印该值,我也得到了传递的值,但出于任何奇怪的原因,DJango 在 GeneroID 字段上添加 Null。

我正在将 MySQL 与 InnoDB 和 Django 1.8 一起使用。我的模型是从旧数据库生成的。

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

模特人物

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'

查看.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:12Django 版本 1.8.2,使用设置“WhiteKoala.settings”在http://127.0.0.1:8000/启动开发服务器使用 CONTROL-C 退出服务器。

通用对象

Pais:Pais对象

{'sql': "插入 Persona (Nombre, Apellido1, Apellido2, NumeroIdentificacionObservacionesFechaNacimientoDireccionFotoGeneroIDPaisID , LugarNacimiento, DireccionID, Profesion, Puesto, LugarTrabajo) VALUES ('ANDREW ', '丰塞卡', 'RIVAS', '', '', NULL, '', NULL, NULL, '', NULL, '', '', '')", '时间': '0.000'}[2015 年 6 月 28 日 17:26:13]“POST/guardarpersona/HTTP/1.1”200 8

错误:

/guardarpersona/处的完整性错误(1048,“列‘GeneroID’不能为空”)

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

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

最佳答案

编辑

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

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

<小时/>

原文:

看起来您的外键是一个不可为空的外键:

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

如果您将其更改为:

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

那么它可以为空。

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

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

如果不是,那么您将需要发出必要的正确后续语句,以使该列在数据库中可为 Null。

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

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

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

执行此操作的 SQL通常看起来内容如下所示:

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

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

关于python - DJANGO 在保存时添加 NULL - IntegrityError at/****/(1048, "***' 不能为 null"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31102519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com