2010-01-08 90 views
8

我正在研究django中的一個項目,該項目要求在他們自己的username名稱空間中有單獨的用戶組。Django - 允許重複的用戶名

因此,例如,我可能有多個「組織」,並且username只應在該組織內唯一。

我知道我可以通過使用一個包含用戶名/組織ID另一種模式做到這一點,但仍然留下的defualt Django的權威性User,我將不得不用的東西來填充這個沒用(和所需的)領域。

我已經編寫了自己的身份驗證後端,用於針對LDAP驗證用戶身份。然而,正如我之前提到的,我仍然堅持如何填充/忽略默認django用戶的username字段的問題。

有沒有辦法爲Django auth用戶刪除username的唯一性約束?

回答

7

我不確定這是否正是您要找的內容,但我認爲您可以使用類似於this answer中的內容。

下面的代碼有效,只要它在Django加載模型時執行的地方。

from django.contrib.auth.models import User 

User._meta.get_field('username')._unique = False 

請注意,如果已經已經創造了它這是不會改變的auth_user表的數據庫唯一約束。因此,您需要在運行syncdb之前在之前更改。或者,如果您不想重新創建auth_user表,則可以進行此更改,然後手動更改數據庫表以刪除約束。

+1

我不確定這會起作用。 「unique」屬性作爲該字段的約束傳播到數據庫。一旦完成,調整Django元信息不會有幫助。如果你永遠不會真的*使用*(即顯示/修改)用戶名,那麼任何使它獨一無二的東西就足夠了。例如。 Dr血液貨幣建議。 – 2010-01-08 16:52:24

+0

這個*做*工作(我試過了),但由於它正在訪問'_meta',它依賴於內部實現而不是記錄的接口,所以我謹慎使用它。 +1,但它確實有效。 – 2010-01-08 17:39:32

+0

那麼,它適用於NOT NULL約束(我試過),所以我不明白爲什麼不。只要「MyUserModel」是繼承自「auth.User」的類,並且該行在模型之後直接放置,這似乎工作。這只是一個有點醜陋的黑客攻擊。 – 2010-01-08 17:44:53

1

我沒有親自被要求找到一個解決方案,但解決這個問題的方法之一(從SAAS的角度來看)將用用戶名前綴組織標識符(假設獨特的組織)。例如:subdomain.yoursite.com將等同於具有用戶名:subdomain_username的用戶。您只需在登錄到子域時編寫一些業務邏輯即可將其添加到用戶名中。

+1

是的,這個工程,我認爲,但用戶名已經只有30個字符,並添加前綴迅速減少到不可用的大小。 – 2010-01-08 17:38:35

5

你可以做的是擴展用戶模型。對於用戶表,生成根本不會在網站中顯示的用戶名(例如A_123,A_345)。

然後創建一個擴展用戶的新模型。

class AppUser(User): 
    username = models.CharField... 
    organization = models.CharField... 

然後,您創建一個使用AppUser而不是User對象的自定義身份驗證後端。

0

我面對完全相同的問題,我一直在閱讀很多(關於如何解決1.5中的問題),我只是想到了一個更簡單的解決方案。如果你只是添加一個固定長度的前綴和組織ID來存儲用戶名呢?

I.e.組織id = 115,選擇的用戶名=「john」,固定長度爲6.因此在數據庫中,您存儲爲用戶名「000115_john」。

當您進行登錄時,您只需加入兩個參數並嘗試使用Django提供的內容進行身份驗證。我不確定固定長度是否是絕對必要的,但如果用戶只用數字選擇用戶名,可以避免不良結果。

+1

如果您想要答案,請將其作爲問題發佈。 – Marcin 2013-06-27 14:17:52