Django在将数据保存到模型时显示错误:django.db.utils.IntegrityError:(1048," Column' id'不能为null")

时间:2016-08-21 15:10:32

标签: mysql django python-3.5

我正在编写一个脚本,可以从不同的API中提取数据并存储到MySQL数据库中。此应用程序将从命令行运行。所以我只使用Django的ORM。

但是当我创建一个没有主键但有一个名为id的列的模型时。当我尝试在此模型中保存数据时,我收到错误 django.db.utils.IntegrityError:(1048," Column' id'不能为空&#34 ;)

我真的很困惑为什么会这样。因为从API我从id列获取值,并且没有机会为此列获取null或空值。

请告诉我这里我做错了什么。

这是我的模特:

class Graphite(models.Model):

    class Meta:
        db_table = 'graphite'

    id = models.BigIntegerField()
    full_name = models.CharField(max_length=250, null=True)
    email = models.CharField(max_length=250, null=True)
    status = models.CharField(max_length=150, null=True)

当我尝试在此模型中保存数据时,这是代码:

    Graphite.objects.using('database_name').create(
      id=row['id'],
      full_name=row['full_name'],
      email=row['email'],
      status=row['status'])

将数据保存到模型中时,我使用 Graphite.objects.using(' database_name')。因为我在此应用程序中连接了多个数据库。

4 个答案:

答案 0 :(得分:0)

嗯,我不确定你是否使用了django迁移,但是它不允许你在django中创建这种模型,你的id属性(在模型中)没有主键作为它的参数(mySQL)。那你为什么不定义:

class Graphite(models.Model):   

    class Meta:
        db_table = 'graphite'           

    id = models.BigIntegerField(primary_key=True)
    full_name = models.CharField(max_length=250, null=True)
    email = models.CharField(max_length=250, null=True)
    status = models.CharField(max_length=150, null=True)

所以在id上设置primary_key?然后,在创建Graphite时,您不必传递ID。

BUT

如果您必须提供id,这是您需要在每个Graphite模型中使用的内容,而且它与主键不同,那么只需将其定义为不同,即可。 s说row_id。但是,当您希望将id设置为primary_key时,您的模型中的True属性仍然应设置为id

编辑(示例)

在mySQL中执行以下命令:

BigIntegerField

然后你的模型应该是这样的:

ALTER TABLE graphite ADD COLUMN row_id BIGINT;

用法:

class Graphite(models.Model):   

    class Meta:
        db_table = 'graphite'           

    row_id = models.BigIntegerField()
    full_name = models.CharField(max_length=250, null=True)
    email = models.CharField(max_length=250, null=True)
    status = models.CharField(max_length=150, null=True)

那就是它。

答案 1 :(得分:0)

问题是您没有主键。

来自docs

  

每个模型只需要一个字段即可使primary_key = True(显式声明或自动添加)。

因此,您必须通过添加$xml = (string) $element; id字段作为主键。然后,它不会抱怨。

答案 2 :(得分:0)

您从默认的django表id覆盖id

所以主键没有id。只需将其primary=True。或使用其他id,例如graphaite_id

答案 3 :(得分:0)

您错过了主键,请确保拥有primary=True并存储id为其创建另一列