且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-11-27 23:30:22

您将要使用 Django加入跨关系的惯例加入查询集中的组表。 / p>

首先,我建议您将关系设为 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'] )

如果要限定多个组,请使用$中的 c $ c>子句:

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

如果要快速查看生成的SQL,你可以这样做:

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


I'm looking to narrow a query set for a form field that has a foreignkey to the User's table down to the group that a user belongs to.

The groups have been previously associated by me. The model might have something like the following:

    myuser = models.ForeignKey(User)

And my ModelForm is very bare bones:

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

So when I instantiate the form I do something like this in my views.py:

    form = MyForm()

Now my question is, how can I take the myuser field, and filter it so only users of group 'foo' show up.. something like:

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

The query in SQL looks like this:

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

I'd like to avoid using raw SQL though. Is it possible to do so?

You'll want to use Django's convention for joining across relationships to join to the group table in your query set.

Firstly, I recommend giving your relationship a related_name. This makes the code more readable than what Django generates by default.

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

If you want only a single group, you can join across that relationship and compare the name field using either of these methods:

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

If you want to qualify multiple groups, use the in clause:

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

If you want to quickly see the generated SQL, you can do this:

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