2016-07-15 53 views
2

默認情況下,每個django模型有3個權限(添加,更改,刪除)。在模型中,我可以定義自定義權限以添加更多內容。如何在django中檢索特定模型的所有權限?

class Company(models.Model): 
    owner = models.ForeignKey(User) 
    name = models.CharField(max_length=64, unique=True) 
    description = models.TextField(max_length=512) 
    created_on = models.DateTimeField(auto_now_add=timezone.now) 

    class Meta: 
     permissions = (
      ("erp_view_company", "Can see the company information"), 
      ("erp_edit_company", "Can edit the company information"), 
      ("erp_delete_company", "Can delete the company"), 
     ) 

當您遷移時,這些權限會自動創建在數據庫級別。如何從模型中檢索所有權限?

# retrieves the permissions 
permissions = Permission.objects.filter(get_all_permissions_of_model_Company) 
# adds permissions to group 
group = Group.objects.create(name='foo', permissions=permissions) 
# adds user to group 
user.groups.add(group) 

回答

5

我建議你這樣的事情:

all_permissions = Permission.objects.filter(content_type__app_label='app label', content_type__model='lower case model name') 

檢索模型app_label

Company._meta.app_label 

檢索模型的小寫名稱:

Company._meta.model_name 

此外,您還可以retrieve a ContentType instance representing a model

ContentType.objects.get_for_model(Company) 

由於ContentType使用緩存,它是完全可以接受的。因此,另一種方式來達到你需要的東西:

content_type = ContentType.objects.get_for_model(Company) 
all_permissions = Permission.objects.filter(content_type=content_type) 
+0

好的,謝謝你的支持! – realnot

1

您可以檢查codename場,這將是這樣的:'change_company'等...

model_name = 'company' 
all_perms_on_this_modal = Permission.objects.filter(codename__contains=model_name) 
+0

我剛纔看到,該表的權限有contentt_ype_id是中值的表django_content_type外鍵。而不是使用代號,使用模型不是更好嗎? – realnot

+1

@realnot我不會使用contenttype,codename沒有連接,所以它更便宜 – doniyor

+0

好的,謝謝你的支持! – realnot

相關問題