Django:如何过滤属于特定组的用户 [英] Django: How to filter Users that belong to a specific group

查看:77
本文介绍了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。是否可以这样做?

解决方案

您将要使用 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 

这篇关于Django:如何过滤属于特定组的用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆