Python 有没有办法使用查询在Django中模拟foreach?

Python 有没有办法使用查询在Django中模拟foreach?,python,sql,django,Python,Sql,Django,我有一个模型“状态”,有许多“组”。每个组都有许多字段“用户”。我想获取特定状态的所有用户。我知道我可以对组执行for循环,并将所有用户添加到列表中。但是组中的用户可以重叠,所以我必须检查用户是否已经在组中。有没有更有效的方法使用查询来实现这一点 编辑:状态有一个组列表。每个组都有一个用户列表。我想从所有组中获取一个状态的用户列表 型号 class Status(geomodels.Model): class Meta: ordering = ['-date']

我有一个模型“状态”,有许多“组”。每个组都有许多字段“用户”。我想获取特定状态的所有用户。我知道我可以对组执行for循环,并将所有用户添加到列表中。但是组中的用户可以重叠,所以我必须检查用户是否已经在组中。有没有更有效的方法使用查询来实现这一点

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

型号

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')

由于您还没有发布模型,所以给您一个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)

根据您发布的型号代码,给定状态的查询为:

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

我不能100%确定调用
distinct()
是否必要,但我似乎记得,如果给定的
UserProfile
在多个共享相同状态的组中,您可能会面临重复的风险。主要的一点是,如果您使用由
相关的\u name
定义的名称或默认的相关名称,则使用通常的下划线符号对多对多关系进行过滤。

我最终创建了我要查找的组的列表,然后查询这些组中的所有用户。这应该非常有效,因为我只使用一个查询

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

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

您可以向我们展示您的模型吗?根据您的模型代码,您希望处于请求状态的组的成员而不是用户,对吗?由于每个组只能有一个使用此代码的用户,我假设您试图遵循m2m关系。是的,这是正确的。我想聚合所有组的成员。@GeorgeMuresan-我已经根据您发布的模型代码更新了我的答案。如果您想这样做,而不是像我显示的那样,
statusGroups=list(status.groups.all())
更有效。您还可以在过滤器中为您的
\u使用查询集,该查询集执行子查询,速度可能会更快,也可能不会更快,具体取决于您的数据库:
UserProfile.objects.filter(groupsIn\u in=status.groups.all())
@GeorgeMuresan-该查询肯定会工作,我刚刚使用内置的用户/组/权限多对多链对我的一个应用程序进行了重新测试。如果返回的结果为空,则可能表明
某些\u状态设置不正确。