2011-08-11 27 views
2

當我試着使用這個指令傾倒在Django我的模型的數據:Django的轉儲:型號不驗證

python manage.py dumpdata app> temp_data.json 

它提供了以下錯誤:

Error: One or more models did not validate: 
asset.authpermission: "codename": CharField cannot have a "max_length" greater than 255 when using "unique=True". 
asset.djangocontenttype: "app_label": CharField cannot have a "max_length" greater than 255 when using "unique=True". 
asset.djangocontenttype: "model": CharField cannot have a "max_length" greater than 255 when using "unique=True". 

的東西是這些表是由django自動生成的。另外我剛剛檢查數據庫(mysql),字段是varchar(100)。

怎麼了?

回答

6

這些表是由manage.py inspectdb產生的嗎?那麼你不需要將django自己的模型包含到實際生成的模型中。請刪除以auth,django,adminsite開頭的任何型號。

只需將相應的contrib應用程序添加到INSTALLED_APPS設置即可,並且不會出現更多錯誤。

+0

很好用,謝謝! – Johanna

+0

啊,+1,好點。 – 2011-08-11 16:10:02

+0

謝謝@Ninefingers – rewritten

3

Django試圖在數據庫後端允許轉儲之前驗證您的模式。問題是這樣的:

當使用「unique = True」時,CharField不能具有大於255的「max_length」。

您遇到的問題是這樣的:CharField轉化爲VARCHAR在SQL - 如果你有max_length那轉化爲VARCHAR(X),其中X是不管你的最大長度設置爲。

對於不是MyISAM的表,MySQL不會索引(散列)用於搜索CharField中長於255字符的任何數據。這也排除了TextField,這轉換爲SQL TEXT

關於索引are fairly comprehensive的MySQL文檔。 CREATE INDEX文檔使您瞭解問題的核心:

FULLTEXT索引僅支持MyISAM表,並且只能包含CHAR,VARCHAR和TEXT列。索引總是發生在整個列上;列前綴索引不受支持,並且如果指定,則任何前綴長度都將被忽略。有關操作的詳細信息,請參見第11.9節「全文搜索功能」。

換句話說,除非你使用MyISAM作爲你的存儲格式,否則你不能這樣做。

對於這是否是設計錯誤有兩種說法:一方面,你可能會爭辯說,如果你需要將一大堆數據作爲一整堆文本進行索引,你真的需要更仔細地考慮這一點。另一方面,你可以爭辯說255是一個任意選擇的極限。爲什麼255而不是300?還是200?我d

我剛剛碰到這個問題我自己。解決辦法是詢問是否實際需要unique=True,然後確定max_length真的需要這麼長時間。在我的情況下,我們存儲sha512輸出,這是128個字符長,所以我只是適當調整了字段大小。

但是,如果您確實需要獨特的長數據,您可以通過覆蓋模型save()方法自行執行此操作。你實際上想要做的是覆蓋full_clean方法,該方法被django.forms.*調用以根據模式驗證模型的數據,然後重寫save方法調用。這樣,無論您直接保存還是在窗體上呼叫is_valid(),都會出現唯一性約束。

另一種選擇是切換到MyISAM,或使用postgres。

+0

感謝您的回答,但問題是我沒有創建有問題的表,django自動做了。我不會在任何地方手動使用它們。我注意到,它沒有驗證模型,因爲我把我的應用程序放在installed_apps中,在一切正常執行之前.. – Johanna

+0

@Johanna,直到你將應用程序添加到installed_apps,django不會嘗試驗證它可能具有的任何模型 - installed_apps告訴它在哪裏可以做到這一點。你安裝這個新的應用程序後運行syncdb嗎?我不希望它工作,因爲後端應該抱怨 - 即使您還沒有使用該代碼區域,這也會抱怨,因爲django會驗證所有模型模式(它實際使用的sql)與數據庫後端(s )。 – 2011-08-11 16:05:46

+0

感謝您的解釋,我是kenw到Django。我很困惑,因爲當我運行服務器時,它說「驗證模型...」。但現在很好,saverio的回答很好 – Johanna