我真的不喜歡你的解決方案 - 這是類似於舊數據庫設計中的模式chnges是預計設計!請,不管代價不要做到這一點。遺忘django,40年的數據庫設計讓我們感到數據庫的模式不應該改變(除非當然需求改變或你的設計不正確)。我可以提供類似於此的答案:RegEx match open tags except XHTML self-contained tags以強調而不是更改數據庫架構的重要性。
所以,你將有一個Django應用程序,你說裏面有用戶模型和模式,這將給一個接口給admininstrator這樣他將添加權限EAH客戶端(管理員將添加權限對於客戶而言,不是開發者)。每個將只有一個名稱和一個ForeignKey
它適用的客戶端。
現在你可以創建一個UserCustomPermission
模式,將會有一個ForeignKey
到User
和另一ForeignKey
到(實際上有User
和之間的許多一對多的關係。
現在,你需要什麼要實現的是你分配的權限將如何分配給實際允許的和禁止的操作。在你的問題中,你沒有對此做任何說明,只是給你一個方向,我真的很喜歡(並且一直使用) django-rules-light應用程序(https://github.com/yourlabs/django-rules-light)可以用來定義你的bu siness規則。
也許我的答案並不能真正解決您的問題,或者我可能並不瞭解某些內容,但我相信您會得到一個出發點 - 也可以隨時更新您的問題,我會更新我的答案因此。
回答到更新
正如你所瞭解的,我不喜歡1和3:對於每一個新客戶,您將需要創建一個新的數據庫?爲什麼不把所有的客戶端流都放在同一個表中,並使用外鍵來訪問它們所屬的客戶端呢?
(在這裏DRAGONS)
我想到了一個很好的解決方案 - 我不會做,但如果要那麼多把你的用戶和他們在不同的數據庫的權限,那麼你可以使用單獨的子在您的高級域中:使用數據庫路由(https://docs.djangoproject.com/en/1.3/topics/db/multi-db/#database-routers)根據子域選擇每個客戶端的數據庫。所以,你會定義所有客戶的數據庫,你的settings.py:
DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
},
'client1': {
'NAME': 'client2',
'ENGINE': 'django.db.backends.mysql',
'USER': 'client2',
'PASSWORD': 'priv4te'
},
'client2': {
'NAME': 'client1',
'ENGINE': 'django.db.backends.mysql',
'USER': 'client1',
'PASSWORD': 'priv4te'
}
}
然後你將創建一個SubDomainDatabaseRouter
類,將使用正確的數據庫根據您的子域名。由於請求設置在該類中不可用,因此必須使用中間件和線程本地語言將它們放在那裏。在下面的代碼片段
https://djangosnippets.org/snippets/2037/
所以看看你的RouterMiddleware
您將檢查子站點,並根據您將設置一個client_cfg
選項與客戶端的名稱。根據client_cfg
,您的SubDomainDatabaseRouter
將使用正確的數據庫。要使用它只需添加
DATABASE_ROUTERS = ['my.package.SubDomainDatabaseRouter']
利用這一點,你必須爲每個客戶端完全不同的數據庫。我需要再次強調一下,你會有一個地獄維護它 - 假設你有100個客戶端,並且需要在一個表中添加一個字段。那又怎麼樣?請不要怪我:)
(OF DRAGONS END)
聽,聽!我認爲你的答案應該被接受,因爲這是正確的答案。我想補充的一件事是:管理網站只爲受信任的用戶設計。 Google:「django admin受信任的用戶」。 – allcaps
我更新了我的問題,使其更清楚我正在處理的是什麼。 – vinayakshukl