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

时间:2013-11-28 05:11:48

标签: python sql django

我有一个带有ManyToManyField'groups'的模型'Status'。每个组都有一个ManyToManyField'用户'。我想让所有用户获得某种状态。我知道我可以对组执行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')

3 个答案:

答案 0 :(得分:0)

由于您尚未发布模型,因此有点难以为您提供django查询集答案,但您可以通过将用户添加到不允许的来解决重叠问题重复。例如:

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)

答案 1 :(得分:0)

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

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

我并非100%确定distinct()调用是必要的,但我似乎记得,如果给定的UserProfile位于具有相同状态的多个组中,您将面临重复的风险。重点是,如果您使用related_name定义的名称或默认的相关名称,则使用通常的下划线表示法过滤多对多关系。

答案 2 :(得分:0)

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

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

    users = UserProfile.objects.filter(groupsIn__in=statusGroups)
相关问题