2011-07-21 62 views
2

我們正在處理的Django項目和我們的postgresql數據庫存在一個小問題。Django AutoField不會返回新的primary_key

我們正在進行的項目是從PHP站點到Django站點的站點/數據庫轉換。所以我們使用inspect db從當前PHP後端生成模型。

它給了我們這一點,我們添加了primary_key和獨特等於true:

class Company(models.Model): 
    companyid = models.IntegerField(primary_key=True,unique=True) 
    ... 
    ... 

,這似乎不是當我們終於得到了節省新的公司進入合作。它會返回一個非空約束的錯誤,所以我們遷移到一個下拉列表AutoField象下面這樣:

class Company(models.Model): 
    companyid = models.AutoField(primary_key=True) 
    ... 
    ... 

這節省了公司進入正常,但問題是,當我們做

result = form.save() 

我們不能做

result.pk or result.companyid 

獲得在數據庫中的新定的主鍵(但我們可以看到,它已被賦予在數據庫中正確companyid。

我們對正在發生的事情感到茫然。任何想法或答案將不勝感激,謝謝!

回答

4

我剛剛遇到同樣的事情,但在一個具有很多歷史的項目的Django升級過程中。太痛苦了......

無論如何,這個問題似乎是由於django的postgresql後端獲取新創建的對象的主鍵:它使用pg_get_serial_sequence來解析表的主鍵序列。在我的情況下,id列不是使用serial類型創建的,而是使用integer創建的,這意味着我的序列未正確連接到table.column。

是基於與創建語句表下,你必須根據自己的情況調整你的表名,列和序列名稱:

CREATE TABLE "mike_test" (
    "id" integer NOT NULL PRIMARY KEY, 
    "somefield" varchar(30) NOT NULL UNIQUE 
); 

的解決方案,如果你正在使用PostgreSQL 8.3或更高版本是很容易的:

ALTER SEQUENCE mike_test_id_seq OWNED BY mike_test.id; 

如果您使用8.1雖然,事情有點muckier。我重新創建我用下面的(簡單的)情況下,列:

ALTER TABLE mike_test ADD COLUMN temp_id serial NOT NULL; 
UPDATE mike_test SET temp_id = id; 
ALTER TABLE mike_test DROP COLUMN id; 
ALTER TABLE mike_test ADD COLUMN id serial NOT NULL PRIMARY KEY; 
UPDATE mike_test SET id = temp_id; 
ALTER TABLE mike_test DROP COLUMN temp_id; 
SELECT setval('mike_test_id_seq', (SELECT MAX(id) FROM mike_test)); 

如果你的列涉及到其他任何限制,你將有更多的樂趣。

相關問題