2009-09-09 93 views
4

我最近開始在業餘時間用Django試驗一些Web應用程序。在爲數據模型設計數據模型時,我遇到了使用繼承來定義網站用戶或者使用已經由框架提供的用戶類稱爲猴子補丁的技術的兩難困境。Django和猴子補丁問題

我試圖藉助於增加一個字段(具有限定的我的所有型號等沒有錯誤之後,根據python manage.py validate):

User.add_to_class('location', models.CharField(max_length=250,blank=True))

和執行的syncdb命令。但是,我不斷收到此錯誤

OperationalError: no such column: auth_user.location

無論我在網站的管理視圖還是manage.py shell。必須有一個額外的步驟,我錯過了,但似乎整個猴子修補技術有限的文件。所以我在求助於繼承之前請求你的幫助。任何代碼,提示或指向其他文檔的指針當然都是受歡迎的。

在此先感謝。

PS。我知道這種技術很醜陋,可能不太合適。 ;)

回答

7

當你添加一個字段到任何模型時,即使你以'官方'的方式,你需要遷移數據庫 - Django不會爲你做。放下桌子並再次運行./manage.py syncdb

您可能想要調查其中一個遷移框架,例如south,它將爲您管理這類事情。

+0

這一個伎倆!儘管sqlall命令沒有顯示任何與User類相關的SQL。謝謝! – 2009-09-09 14:11:03

0

Djangos框架使用元類來初始化表。這意味着你不能在新的專欄中進行猴子補丁,除非你還重新初始化課程,我不確定這是甚麼可能的。 (可能是)。

請參閱Difference between returning modified class and using type()瞭解更多信息。

+0

當創建模型類時,Django確實會做各種類型的元類別技巧,但調用add_to_class方法(如OP所做的)恰恰是後來動態添加新字段的正確方法(它執行必要的技巧)。簡單地將該字段作爲類屬性(不調用add_to_class)將不起作用。這裏的問題與元類無關,與Django缺乏內置數據庫模式遷移有關。 – 2009-09-09 15:29:00

+0

啊。當他實際上沒有做任何事情時,我被他提到猴子補丁所欺騙了。 – 2009-09-09 15:53:10

0

我想你可能遇到問題,你的monkeypatch定義在哪裏。我猜django syncdb只是從「純粹」auth應用程序創建數據庫表,所以你的模型將沒有「位置」,然後你的網站與補丁將尋找該領域。

向用戶配置文件添加其他信息的可能較不痛苦的方式描述爲in Django docs

13

這兩種方法都有一種替代方法,那就是簡單地使用a related profile model。這也恰好是一個有據可查的強烈推薦的方法。正如你所指出的,也許add_to_class方法沒有很好記錄的原因是因爲它是explicitly discouraged(出於很好的理由)。

+0

相關的配置文件似乎是這方面的流行方式。引用用戶字段的編碼風格雖然有點醜陋,而且對我來說有點不直觀。我一定會探討這一點。 – 2009-09-09 14:12:21

+0

+1:只需使用該配置文件,它的工作原理非常奇妙。 – 2009-09-09 14:37:58

+0

這是在django.contrib.auth系統中擴展用戶系統的推薦方式。如果您需要長期維護此係統,使用配置文件將爲您提供對框架本身進行乾淨升級的最佳機會。 – wlashell 2009-09-09 18:39:02