我创建了我的模型,一切运行顺利,但我必须创建另一个字段,所以我创建了它并将其添加到模型定义中。之后(我不是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')
有点傻,产生同样的错误。但是,当我尝试做正确的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'
有什么想法吗?它工作正常,我添加了几条记录.....提前感谢
答案 0 :(得分:0)
添加模型字段后是否迁移了数据库?我建议您在将来使用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')
答案 1 :(得分:0)
经过几次测试后再进行挖掘'进入我的主要嫌疑人:Postgresql,我找到了解决方案:
ALTER TABLE imageset_image ALTER COLUMN id SET DEFAULT nextval('imageset_image_id_seq'::regclass);
现在的问题是:因为它以前在工作,而且我一直在使用管理员。为什么会这样?也许Django在添加新字段后的syncdb是ERASING id字段的默认值?这不应该发生。