Django:如何过滤属于特定组的用户

时间:2009-11-27 22:51:30

标签: python django

我希望将具有外键的表单字段的查询集缩小到用户表,直到用户所属的组。

这些小组之前已经与我联系过了。该模型可能具有以下内容:

    myuser = models.ForeignKey(User)

而我的ModelForm非常简单:

class MyForm(ModelForm):
    class Meta:
        model = MyModel

因此,当我实例化表单时,我会在views.py中执行类似的操作:

    form = MyForm()

现在我的问题是,我如何获取myuser字段并对其进行过滤,以便只有'foo'组的用户出现...类似于:

form.fields["myuser"].queryset = ???

SQL中的查询如下所示:

mysql> SELECT * from auth_user INNER JOIN auth_user_groups ON auth_user.id = auth_user_groups.user_id INNER JOIN auth_group ON auth_group.id = auth_user_groups.group_id WHERE auth_group.name = 'client';

我想避免使用原始SQL。是否可以这样做?

2 个答案:

答案 0 :(得分:45)

您需要使用Django's convention for joining across relationships加入查询集中的组表。

首先,我建议你的关系为related_name。这使得代码比Django默认生成的代码更具可读性。

class Group(models.Model):
    myuser = models.ForeignKey(User, related_name='groups')

如果您只想要一个组,则可以加入该关系并使用以下任一方法比较名称字段:

form.fields['myuser'].queryset = User.objects.filter(
    groups__name='foo')
form.fields['myuser'].queryset = User.objects.filter(
    groups__name__in=['foo'])

如果您想要限定多个组,请使用in子句:

form.fields['myuser'].queryset = User.objects.filter(
    groups__name__in=['foo', 'bar'])

如果要快速查看生成的SQL,可以执行以下操作:

qs = User.objects.filter(groups__name='foo')
print qs.query 

答案 1 :(得分:16)

这是一个非常古老的问题,但对于那些在Google上搜索答案的人(就像我一样),请知道接受的答案不再是100%正确。用户可以属于多个组,因此要正确检查用户是否在某个组中,您应该执行以下操作:

qs = User.objects.filter(groups__name__in=['foo'])

当然,如果要检查多个组,可以将其添加到列表中:

qs = User.objects.filter(groups__name__in=['foo', 'bar'])