最近从Oracle迁移到Postgres并从Django 1.2升级到1.3后,我们在将对象保存到数据库时开始遇到问题。当调用save()时,不返回id,即使通过标准django管理面板保存标准django auth模型,也会发生这种情况(即使用户已添加到db,也会返回'/ admin / auth / user / None /')并有一个id。。
我们运行相同数据库的所有其他站点都没有这个问题,但它们运行的是Django 1.1或1.2。
我们发现,对于迁移后创建的新表,它们的序列有一个'拥有'属性,该属性由序列所在的列(通常是id列)拥有。改变'拥有'属性修复了我们在1.3中遇到的问题。
有人知道这个问题的根源是什么吗?我们已经找到了解决方案,如果其他人有这个问题,但我们很想知道是什么导致了这个问题。
答案 0 :(得分:6)
在postgresql中,如果你拥有一个对象,你可以有效地做任何你想做的事情。因此,如果您不是所有者,则需要在序列上授予用户“USAGE”。
答案 1 :(得分:1)
似乎django可能使用pg_get_serial_sequence
来获取与表的列相关联的序列,然后使用currval
来获取序列的当前值,但如果序列不归表所有,则不是与列关联,因此无法正常工作。
OWNED BY
属性将序列与给定的表和列相关联。如果序列的OWNED BY
设置为NULL
,则它本质上是一个独立的序列,并且不以任何方式与任何表或列真正关联,甚至与主键关联的更少。