2013-05-08 50 views
0

选择用户,我有两个型号:的Django从单独的模型

class PlayerPermissionGroup(models.Model): 
    player = models.ForeignKey(Player) 
    name = models.CharField(max_length=200) 

class PlayerPermissionGroupMember(models.Model): 
    permission_group = models.ForeignKey(PlayerPermissionGroup) 
    user = models.ForeignKey(User) 

目前,得到所有成员的权限组我做的:

getMembers(group): 
    group_member_ids = (PlayerPermissionGroupMember.objects.filter(permission_group=group) 
                 .values_list('user__id')) 
    return User.objects.filter(pk__in=group_member_ids) 

有没有更好/更清洁的方式来去做?

回答

1

你可能FK添加related_name给你User

class PlayerPermissionGroupMember(models.Model): 
    permission_group = models.ForeignKey(PlayerPermissionGroup) 
    user = models.ForeignKey(User, related_name='player_permision_groups') 

然后,你可以这样做:

getMembers(group): 
    return User.objects.filter(player_permision_groups__permission_group=group) 

您可能略有省略related_name但查找改变使用默认related_name那Django代替。

+0

太棒了,正是我在找的!我假设这只是你的内部查询然后在SQL端? – 2013-05-11 22:55:05

+0

是的,你可能知道,Django中的查询是懒惰的,所以你可以链接'distinct','values','values_list'等方法,并且单个sql查询将在末尾被构建:) – Gerard 2013-05-17 16:48:28