【发布时间】:2011-08-11 06:02:25
【问题描述】:
我正在构建通过 GET 传递给查询集过滤器的动态过滤器:
for k, v in request.GET.iteritems():
kwargs[str(k)] = str(v)
students = models.Student.objects.filter( **kwargs )
它适用于我提出的几乎所有查询。但是,我有一个具有多对多关系的相关模型,组。所以一个学生可以是许多组的成员。我可以使用以下方法过滤属于给定组的学生:
'groups__in='+str(group.id)
例如- //example.com/students/?groups__in=1
但我不知道如何过滤不属于任何组的学生。我尝试了以下方法但没有成功:
groups__in=None # students == []
groups__exact=None # students == []
groups__iexact=None # FAIL not that I really expected this to work
groups__isnull=True # students == []
最后一个版本是我希望实际工作的版本。我确信我可以通过将顶部代码修改为类似的东西来实现这一点
if request.GET['something']:
students = models.Student.objects.exclude(groups__isnull=False)
else:
students = models.Student.objects.filter( **kwargs )
所以我想问题变成了,我该如何创建
students = models.Student.objects.exclude(groups__isnull=False)
使用 .filter()?
【问题讨论】:
-
我接受了第一个响应,因为它是正确的,但这并没有解决我的错误。 **kwargs 中有一个扩展问题,我对此提出了一个新问题here。谢谢
-
感谢@jammon 和@DTing。真正的问题是试图在 GET 中传递一个布尔值。它通过 **kwargs 作为字符串 'True' 传递,而不是
True。传递给models.Student.objects.exclude( **kwargs )时有效,因为“真”的计算结果为True。但是共轭不起作用,因为当传递给models.Students.objects.filter( **kwargs )时,'False' 仍然评估为True。因此我很困惑。
标签: django filter many-to-many