2017-08-24 34 views
6

我知道syncdbmakemigrations,但我們僅限於在生產環境中執行此操作。Django admin - 模型對超級用戶可見,而非員工用戶

我們最近在生產中創建了幾個表格。正如預期的那樣,任何用戶的管理員都無法看到表格。
郵報說,我們有以下生產SQL手動執行2個查詢(我跑我的地方遷移,做show create table查詢來獲取原始的SQL

django_content_type

INSERT INTO django_content_type(name, app_label, model) 
values ('linked_urls',"urls", 'linked_urls'); 

auth_permission

INSERT INTO auth_permission (name, content_type_id, codename) 
values 
('Can add linked_urls Table', (SELECT id FROM django_content_type where model='linked_urls' limit 1) ,'add_linked_urls'), 
('Can change linked_urls Table', (SELECT id FROM django_content_type where model='linked_urls' limit 1) ,'change_linked_urls'), 
('Can delete linked_urls Table', (SELECT id FROM django_content_type where model='linked_urls' limit 1) ,'delete_linked_urls'); 

Now thi超級用戶可以看到該模型,並且也可以授予員工用戶訪問權限,但員工用戶無法看到它。
是否有任何需要輸入的表格條目?

還是有沒有其他辦法可以解決這個問題沒有syncdb,遷移

+0

可能有_staff_用戶的組。你有權限嗎? –

+0

是的,還有很多不屬於任何組的獨立員工用戶! – NoobEditor

+0

然後我建議創建用戶組「員工」並將其分配給所有員工用戶。我沒有這樣做,但應該也可以通過一條SQL命令來處理這個任務。 –

回答

1

因此,終於有了解決方案。我在django和apparanetly函數下面進行了大量調試(django.contrib.auth.backends)完成提供權限的工作。

​​

那麼問題是什麼?

INSERT INTO django_content_type(name, app_label, model) 
values ('linked_urls',"urls", 'linked_urls'); 

看起來開始很好,但執行的實際查詢爲:

--# notice the caps case here - it looked so trivial, i didn't even bothered to look into it untill i realised what was happening internally 
INSERT INTO django_content_type(name, app_label, model) 
values ('Linked_Urls',"urls", 'Linked_Urls'); 

所以Django的,在內部,做migrate時,可確保一切都在下遷移

問題在此查詢撒謊案例 - ,這是問題

我有一個單獨的查詢執行小寫所有以前的插入和voila

3

我們最近在生產中創建了幾個表格。

我可以通過兩種方式閱讀您在那裏寫的內容。

第一種方式:您使用SQL語句創建了表,但Django中沒有相應的模型。如果是這種情況,那麼就不要糾纏於會讓Django突然使用這些表的內容類型和權限。您需要爲表格創建模型。也許他們會是unmanaged,但他們需要存在。

第二種方式:Django中的相應模型確實存在,您只需爲它們手動創建表,這不是問題。我想在這種情況下做的就是運行下面的代碼,解釋代碼後如下:

from django.contrib.contenttypes.management import update_contenttypes 
from django.apps import apps as configured_apps 
from django.contrib.auth.management import create_permissions 

for app in configured_apps.get_app_configs(): 
    update_contenttypes(app, interactive=True, verbosity=0) 

for app in configured_apps.get_app_configs(): 
    create_permissions(app, verbosity=0) 

什麼上面的代碼所做的基本上是執行Django的執行運行遷移工作。當發生遷移時,Django只是根據需要創建表,然後在完成後調用update_contenttypes,它掃描與項目中定義的模型相關聯的表並將django_content_type表添加到需要添加的任何需要的表中。然後它調用create_permissions更新auth_permissions與添加/更改/刪除權限,需要添加。我已經使用上面的代碼強制早期創建權限during a migration。例如,如果我有數據遷移,創建需要引用新權限的組,則這很有用。

+0

它是你提到的第二種方法。現在,我的問題是我沒有權限在prod/preprod上運行shell。是否有任何原始的'sql'東西,我可以傳遞給DBA來執行查詢並完成工作? – NoobEditor

+0

你沒有這個問題。任何Django管理命令都可以通過從python代碼中調用'django.core.management.call_command'運行。如果您創建了一個包含該函數的視圖,那麼您可以運行任何您想要的東西。但是,如果有疑問,還可以使用[subprocess](https://docs.python.org/3/library/subprocess.html)庫來調用python中的命令以及此類Django視圖。是的,兩種方式都可以讓你運行遷移。 – Melvyn

相關問題