繁体   English   中英

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

[英]Django tries to add a null value in id (primary key) field

我创建了模型,一切运行顺利,但是我必须创建另一个字段,因此我创建了它并将其添加到模型定义中。 之后(我不是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, , ) 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忘记了SERIAL,即使它们在那里

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

有任何想法吗? 工作正常,我添加了几条记录.....在此先感谢

添加模型字段后,是否迁移了数据库? 我建议您将来看看使用South进行迁移。 这很棒。 这个问题很好地涵盖了这个话题。

除此之外,在第二部分代码中,您似乎要插入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字段的默认值? 这是不应该发生的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM