2017-08-24 79 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

相关问题