我希望将具有外键的表单字段的查询集缩小到用户表,直到用户所属的组。
这些小组之前已经与我联系过了。该模型可能具有以下内容:
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。是否可以这样做?
答案 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'])