2011-09-20 58 views
5

我正在將來自php應用程序的MySQL數據庫集成到新的Django項目中。 Inspectdb運行良好,我只需要將幾個字段更改爲ForeignKeys,現在所有讀取和編輯當前數據的工作都很好。Django - 遺留數據庫和'id'字段的問題

問題是當我嘗試創建新條目時,出現錯誤"Field 'id' doesn't have a default value"。回溯從form.save()調用開始,異常來自MySQL光標。在大多數情況下,列被命名爲id但在一個情況下,它是一個名爲值:

class ModelOne(models.Model): #normal "id" named pk 
    id = models.AutoField(primary_key=True, db_column='id', default=None) 
    other_fields = ... 

class ModelTwo(models.Model): #specific pk 
    named_pk = models.AutoField(primary_key=True, db_column='named_pk', 
           default=None) 
    other_fields = ... 

對於ModelTwo,當我發佈一個有效的形式,我得到的錯誤,但以後我回到我的數據列表,新項目顯示!在我檢查了shell中最新的id值後,我可以看到它們正在遞增。

但是對於ModelOne(只有id),錯誤仍然顯示,並且pk變爲2147483647(最大值),並且後續保存由於重複的id而失敗。 (下一個最高PK只有62158)

我需要做些什麼才能讓這些ID字段正常工作?


更新:仍然沒有運氣修復此。考慮轉儲數據並將其導入新的,Django構建的表格。仍在尋找解決這個問題的辦法。


UPDATE2:從數據庫外殼 信息

ModelOne:

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 

ModelTwo:

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| named_pk | int(11)  | NO | PRI | NULL | auto_increment | 
+0

如果刪除了'默認會發生什麼=無'? –

+0

@Daniel Roseman - 同樣的事情。我只是試圖直接解決錯誤指向的錯誤 –

回答

1

我結束了從原始數據庫導出數據從模型和默認NULL,並將其加載到一個新的數據庫,其是由我的模型/項目生成的。

我想我已經嘗試了太多的事情,我正在處理原始數據庫的副本,並且搞砸了底層SQL的pk字段。

我很高興我只用了一份副本。

+0

同樣的事情發生在我身上,同樣的問題。數據導出,然後重新創建表允許django設置mysql自動增量屬性,正確地將新pk的生成委託給mysql。 – hobs

3

這是有道理的定義PK的ModelTwo(因爲你已經在做),因爲你的pk有不同的名字'named_pk'。但是,不需要明確定義'id'作爲ModelOne的pk。 Django默認會創建id列。因此,不要爲ModelOne定義id列。

UPDATE:刪除「默認值=無」從數據庫ModelTwo爲named_pk

+0

我也試過這種方法。如果我進入SQL並查看能力結構,那麼已經有一個設置爲auto_increment的「id」列。我認爲問題在於Django認識到它。儘管它實際上保存了正確的數據,但爲什麼ModelTwo出現錯誤? –

+0

我更新了我的問題,以顯示'SHOW COLUMNS FROM table_name'的MySQL輸出。我並不完全遵循你所說的話,ModelTwo沒有名爲'id'的列。字段'named_pk'一直是PK專欄。對於該模型,'named_pk'的實際值非常重要(它與購買系統中的連續訂單號相關)。 –

+0

如果ModelTwo表中沒有'id'列,那麼保存ModelTwo時會出現什麼錯誤? –

5

經過一些複雜的南遷移之後,我遇到了同樣的問題。 我們希望避免重新加載數據庫(轉儲/導入),幸運的是,它會在搜索相同問題後幫助其他人員落在此帖子上。

我們發現了一個解決方案,無需導出和導入數據庫即可解決此問題。

對於表命名AUTH_USER,下面的MySQL命令將定勢上述錯誤消息:

ALTER TABLE auth_user MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT; 

從原來的解決方案:

http://webit.ca/2012/01/field-id-doesnt-have-a-default-value/

+0

+1這對我有用。 –