【问题标题】:Django tries to add a null value in id (primary key) fieldDjango 尝试在 id(主键)字段中添加空值
【发布时间】:2013-04-09 14:37:17
【问题描述】:

我创建了我的模型,一切运行顺利,但我必须创建另一个字段,所以我创建了它并将其添加到模型定义中。之后(我不是 100% 是这个原因)Django 的管理员尝试在 ID 字段中添加 NULL 值。

初始模型:

class Image(models.Model):
    setid = models.ForeignKey(Imageset, null=False)
    originalwidth = models.PositiveIntegerField(editable=False)
    originalheight = models.PositiveIntegerField(editable=False)
    originalimage = models.ImageField('Imagem', upload_to=image_upload_to, height_field='originalheight', width_field='originalwidth')
    alt = models.CharField('Alt', max_length=128, help_text='ALT da imagem', null=False, blank=False)
(removed from brevity...)

    def save(self):
        super(Image, self).save()
        self.create_thumbnail()

然后我添加了这个字段

thumbnail = models.ImageField(max_length=128, null=True, editable=False, upload_to=True)

并在数据库中手动添加缩略图字段。

管理员在 UPDATES 上工作得非常好,但它拒绝添加新记录。 错误是“Violation of non-null constraint". DETAIL: Failing row contains (null, 1, 700, 701, f/3/f3d4357f7c697aa08dc65f7d866cc30d_14.jpg, ddd, , )

create_thumbnail 方法很好,我只是删除了它,删除了自定义保存,似乎没有任何效果。

根据该消息,Django 正在尝试运行如下内容:

INSERT INTO "public"."imageset_image" ("id","setid_id","originalwidth","originalheight","originalimage","alt")
VALUES (null, 1, 999, 999, 'a/4/a49ba4fc8cbc32f760cb51d84cf9d0cc.jpg', 'alt')

wich 有点傻,会产生同样的错误。但是,当我尝试做正确的 SQL 时

INSERT INTO "public"."imageset_image" ("setid_id","originalwidth","originalheight","originalimage","alt")
VALUES (1, 999, 999, 'a/4/a49ba4fc8cbc32f760cb51d84cf9d0cc.jpg', 'alt')

再次出错。

似乎由于某种原因 Postgresql 忘记了序列号,即使它们在那里

SELECT * FROM information_schema.sequences WHERE sequence_catalog='catalogname' AND sequence_schema='public' AND sequence_name='imageset_image_id_seq'

有什么想法吗?它工作正常,我添加了几条记录......提前谢谢

【问题讨论】:

  • 我不使用 django... 但作为一个猜测;也许您的 id 列没有设置为主键,所以您的 ORM 将其视为普通列?...使用 psql 检查表定义。
  • 看起来确实是问题所在,但是所有的PK规则都在那里。也许有些规则——表坏了。此外,当我运行manage.py inspectdb django 检测到所有ID 字段确实是id = models.IntegerField(primary_key=True)
  • LOL 我找到了答案,但我不能在这里发布,因为我没有足够的声誉。是的,PK 在那里,ID 在那里,但是(可能)Django 删除了使 PK 作为串行(自动增量)字段工作所需的默认值。那个是ALTER TABLE imageset_image ALTER COLUMN id SET DEFAULT nextval('imageset_image_id_seq'::regclass);

标签: python django postgresql


【解决方案1】:

您是否在添加模型字段后迁移了数据库?我建议您在将来考虑使用 South 进行迁移。这很棒。 This question 很好地涵盖了这个主题。

除此之外,在第二段代码中,您似乎插入了 setid_id 而不是 id 本身。如果您仍想走手动路线,请尝试:

INSERT INTO "public"."imageset_image" ("id", "setid_id","originalwidth","originalheight","originalimage","alt")
VALUES (1, 1, 999, 999, 'a/4/a49ba4fc8cbc32f760cb51d84cf9d0cc.jpg', 'alt')

【讨论】:

  • 但我不必将 ID 放入查询中,因为它是 SERIAL PK 自动递增的
【解决方案2】:

经过几次测试并深入了解我的主要嫌疑人:Postgresql,我找到了解决方案:

ALTER TABLE imageset_image ALTER COLUMN id SET DEFAULT nextval('imageset_image_id_seq'::regclass);

现在的问题是:因为它以前可以工作并且我一直在使用管理员。为什么会这样?也许添加新字段后 Django 的 syncdb 是 ERASING id 字段的默认值?这是不应该发生的。

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 2016-01-18
    • 2021-10-24
    • 2018-06-10
    • 1970-01-01
    • 2015-02-21
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多