我希望将具有外键的表单字段的查询集缩小到用户表,直到用户所属的组.
这些小组之前已经与我联系过了.该模型可能具有以下内容:
myuser = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
而我的ModelForm非常简单:
class MyForm(ModelForm):
class Meta:
model = MyModel
Run Code Online (Sandbox Code Playgroud)
因此,当我实例化表单时,我在views.py中执行类似的操作:
form = MyForm()
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,我如何获取myuser字段,并过滤它,以便只有'foo'组的用户出现..类似于:
form.fields["myuser"].queryset = ???
Run Code Online (Sandbox Code Playgroud)
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';
Run Code Online (Sandbox Code Playgroud)
我想避免使用原始SQL.有可能这样做吗?
Joe*_*way 50
您将希望使用Django的约定来加入跨关系以加入查询集中的组表.
首先,我建议给你的关系一个related_name.这使代码比Django默认生成的代码更具可读性.
class Group(models.Model):
myuser = models.ForeignKey(User, related_name='groups')
Run Code Online (Sandbox Code Playgroud)
如果只需要一个组,则可以跨该关系加入,并使用以下任一方法比较名称字段:
form.fields['myuser'].queryset = User.objects.filter(
groups__name='foo')
form.fields['myuser'].queryset = User.objects.filter(
groups__name__in=['foo'])
Run Code Online (Sandbox Code Playgroud)
如果要限定多个组,请使用以下in子句:
form.fields['myuser'].queryset = User.objects.filter(
groups__name__in=['foo', 'bar'])
Run Code Online (Sandbox Code Playgroud)
如果要快速查看生成的SQL,可以执行以下操作:
qs = User.objects.filter(groups__name='foo')
print qs.query
Run Code Online (Sandbox Code Playgroud)
小智 16
这是一个非常古老的问题,但对于那些谷歌搜索答案(就像我做的那样),请知道接受的答案不再是100%正确.用户可以属于多个组,因此要正确检查用户是否在某个组中,您应该:
qs = User.objects.filter(groups__name__in=['foo'])
Run Code Online (Sandbox Code Playgroud)
当然,如果要检查多个组,可以将它们添加到列表中:
qs = User.objects.filter(groups__name__in=['foo', 'bar'])
Run Code Online (Sandbox Code Playgroud)