2010-02-16 70 views
2

我發展與我的Django的app.I使用對象和權限之間的關係一般的基於對象的權限的認證後端:Django的通用關係實踐

class GroupPermission(models.Model): 
    content_t= models.ForeignKey(ContentType,related_name='g_content_t') 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_t', 'object_id') 
    permission=models.ForeignKey(Permission) 
    group = models.ForeignKey(Group) 

,現在我想一切指定內容類型的對象,其中某個組或用戶具有某種權限。什麼是最好的方式來做到這一點? 我是否應該在應用模型中定義關係的第二端?或更好地編寫自定義的SQL? 我想建立一個通用的後端,所以我不希望它依賴於使用它的應用程序。 謝謝!

回答

3

我猜你正在尋找的東西,如:

perm = Permission.objects.get(pk=1) # pk #1 for brevity. 
group = Group.objects.get(pk=1)  # Again, for brevity. 
group_perms = GroupPermission.objects.filter(permission=perm, group=group) 
objects = [x.content_object for x in group_perms] 

這應該讓所有有perm權限,以及group集團到變量objects對象。

您可以實現這爲Custom Manager類,還有:

class GroupPermissionManager(models.Manager): 
    def for(self, perm): 
     group_perms = GroupPermission.objects.filter(permission=perm, group=self) 
     objects = [x.content_object for x in group_perms] 

class Group(models.Model): 
    name = models.CharField(max_length=30) 
    permissions = GroupPermissionManager() 

這將使您的視圖代碼簡單:

perm = Permission.objects.get(pk=1) # pk #1 for brevity. 
group = Group.objects.get(pk=1)  # Again, for brevity. 
objects = group.permissions.for(perm)  
+0

這就是我一直在尋找for.Thanks! – Dudevil 2010-02-16 21:32:15