2009-12-20 45 views
3

我需要爲我的Django項目中的每個用戶附加大量附加屬性。其中一些屬性是簡單的CharFields,其他的則更復雜ManyToManyFields。對我來說麻煩的是,在我挖掘方法來做到這一點時,我發現了兩個選擇:文檔中解釋的The user profile method和我看到在互聯網上浮動的user subclassing method在Django中處理額外用戶數據的正確方法?

他們都看起來很複雜,我寧願不選擇一個,只發現我經過幾個月的發展需要回去切換到另一種方法,所以我在這裏問。 權利哪種方式?

+0

我也在爲此而戰。配置文件會添加額外的不需要的圖層,而子分類會在數據庫中創建額外的不需要的表格(我相信),並且不會對'request.user'使用多餘的修改。這似乎是這樣一個常見的情況,你會認爲會有一個明確的,很好的方式來做到這一點。其他框架遵循「級聯」而不是「覆蓋」的範式,您可以輕鬆擴展所有基類,並且只需讓它們工作,但不會,這太方便了。 – mpen 2009-12-20 23:08:06

+0

如果您希望User類擁有所有額外的字段,那麼在同步數據庫時可以使用它,但這需要一些額外的工作。您只需在特定模型中添加字段並手動更改數據庫表。它不漂亮,但沒有不需要的圖層和表格。您只需編寫: User.division = ForeignKey('Division') 然後將適當的列添加到表中。但是我相信這會是我自己的受虐狂;-)子類很好,特別是ORM會隱藏你的兩張表。 – gruszczy 2009-12-20 23:11:36

+0

@gruszyczy:如您所說,可以簡單地將附加字段monkeypatch到現有模型上。但是你的代碼被破壞了。你必須這樣做才能正確地設置字段:models.ForeignKey('Division')。contribute_to_class(User,'division') – 2009-12-21 23:21:17

回答

2

我一直以傳統方式完成它,這意味着用戶配置文件,因爲它是在文檔中建議的,但這不是最清晰和最優雅的解決方案。您必須始終處理用戶沒有配置文件的可能性,而我不太喜歡這種配置文件。在下一個項目中,我希望使用子類,如果它只是穩定版本的Django,我會按我公司的同事來嘗試。這似乎更自然。

如果你想保持安全,請使用proile。如果您希望冒一點風險並從更好的解決方案中受益,請使用子類。它的推出是有原因的 - 有幾次關於配置文件解決方案弱點的討論。

+0

沒有太多的答案在這一個,但這一個,加上唯一的其他答案似乎指向我在配置文件方向。如果它南下,我一定會在這裏提出跟進;-) 感謝您的建議! – 2009-12-21 09:13:14

0

推薦的,看起來最簡單的是用戶配置文件方法。

0

我選擇了不同的路徑:我有一個客戶端模型,女巫應該進行身份驗證。我沒有將用戶模型擴展到適合我的客戶端模型,而是將它們分開。然後,當我保存一個新的客戶端時,在Client save()方法中爲該客戶端創建一個用戶。然後,我也會執行相同的更新和刪除操作以保持同步。我嘗試了另外兩種選擇,但每種都有很多缺點,這就是我放棄它們的原因。這對我來說非常好。

問候。阿爾多。

0

和aldux一樣,我更喜歡創建一個分離的模型並讓用戶模型不變。

相關問題