2013-11-28 69 views
0

我有一个模型'状态'与ManyToManyField'组'。每个组都有一个ManyToManyField'用户'。我想让所有的用户都有一定的地位。我知道我可以对组进行for循环,并将所有用户添加到列表中。但是组中的用户可能会重叠,因此我必须检查用户是否已经在组中。有没有更有效的方式来使用查询做到这一点?有没有办法在Django中使用查询来模拟foreach?

编辑:状态有一个组列表。每个组都有一个用户列表。我想从所有组中获得一个用户的列表。

模式

class Status(geomodels.Model): 
    class Meta: 
     ordering = ['-date'] 

    def __unicode__(self): 
     username = self.user.user.username 
     return "{0} - {1}".format(username, self.text) 

    user = geomodels.ForeignKey(UserProfile, related_name='statuses') 
    date = geomodels.DateTimeField(auto_now=True, db_index=True) 
    groups = geomodels.ManyToManyField(Group, related_name='receivedStatuses', null=True, blank=True) 

class Group(models.Model): 
    def __unicode__(self): 
     return self.name + " - " + self.user.user.username 

    name = models.CharField(max_length=64, db_index=True) 
    members = models.ManyToManyField(UserProfile, related_name='groupsIn') 
    user = models.ForeignKey(UserProfile, related_name='groups') 
+0

你能告诉我们你的模型吗? – Rohan

+0

根据您的模型代码,您希望成员而不是用户处于请求状态的组,对吧?由于每个组只能拥有一个使用此代码的用户,我假设您正在尝试遵循m2m关系。 –

+0

是的,这是正确的。我想汇总所有组的成员。 –

回答

0

我最终创建了一个我正在查找的组的列表,然后查询任何这些组中的所有用户。这应该是相当有效的,因为我只使用一个查询。

statusGroups = [] 
    for group in status.groups.all(): 
     statusGroups.append(group) 

    users = UserProfile.objects.filter(groupsIn__in=statusGroups) 
+1

如果你想这样做,而不是我显示的方式,'statusGroups = list(status.groups.all())'更有效率。你也可以为你的'__in'过滤器使用一个查询集,它执行一个子查询,根据你的数据库可能会也可能不会更快:'UserProfile.objects.filter(groupsIn__in = status.groups.all())' –

0

当你还没有发布你的模型,它有点很难给你一个Django queryset的答案,但你可以通过添加用户到一套解决您的重叠问题不允许重复。例如:

from collections import defaultdict 

users_by_status = defaultdict(set) 

for i in Status.objects.all(): 
    for group in i.group_set.all(): 
     users_by_status[i].add(group.user.pk) 
0

基于您发布的型号代码,对于给定的状态查询:

UserProfile.objects.filter(groupsIn__receivedStatuses=some_status).distinct() 

我不是100%肯定的distinct()调用是必要的,但我似乎回想一下,如果给定的UserProfile处于共享相同状态的多个组中,那么您将冒着重复的风险。主要观点是,如果使用related_name或默认相关名称定义的名称,则使用通常的下划线表示法可以过滤多对多关系。

+0

这不起作用,它只是返回一个空白列表。 –

+0

@GeorgeMuresan - 这个查询应该可以正常工作,我只是使用内置的用户/组/许可证多对多链来重新测试我的一个应用程序。如果它返回一个空结果,那可能表明'some_status'设置不正确。 –

相关问题