Django试图在id(主键)字段中添加一个空值

2024-05-18 07:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了我的模型,一切运行顺利,但我必须创建另一个字段,所以我创建了它并将其添加到模型定义中。之后(我不是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()

然后我添加了这个字段

^{pr2}$

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

管理员在更新方面工作得很好,但拒绝添加新记录。 错误是“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')

威奇有点傻,也会犯同样的错误。但是,当我试着做正确的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'

有什么想法吗?很好,我加了几张唱片。。。。。提前谢谢


Tags: imageselfidfalsemodelspublicaltnull
2条回答

在添加了模型字段之后,您是否迁移了数据库?我建议您考虑一下将来使用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')

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

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

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

相关问题 更多 >