Django 中的虚拟过滤器
Dummy filters in Django
如何在 Django 中创建虚拟过滤器查询(始终匹配的过滤器)和从不匹配的排除查询。原因是因为在某些情况下我的查询是 None,在这些情况下我想使用虚拟过滤器。这是代码:
MyModel.objects.filter(filterQuery).exclude(excludeQuery)
在 filterQuery
或 excludeQuery
是 None
的情况下,我得到一个错误,所以我想在该查询之前添加以下条件:
if filterQuery == None: filterQuery = ???
if excludeQuery == None: excludeQuery = ???
MyModel.objects.filter(filterQuery).exclude(excludeQuery)
您应该只在需要时 filter/exclude 执行此操作,而不是使用空语句:
found = MyModel.objects.all()
if filterQuery:
found = found.filter(filterQuery)
if excludeQuery:
found = found.exclude(excludeQuery)
最好的方法是使用字典,尤其是当您有复杂的过滤器时。
filterQuery = excludeQuery = {}
# optionally set the filters based on some logic
if 1==1:
filterQuery['agent'] = 'John'
if 2==2:
excludeQuery['user_id__in'] = [1, 2]
if 3==3:
filterQuery['time__gte'] = timezone.now()
MyModel.objects.filter(**filterQuery).exclude(**excludeQuery)
您可以像 Shang 建议的那样添加一些 ifs 以查看是否需要应用过滤器,但我怀疑性能损失很大并且这更具可读性。
我上面的回答的另一种选择是使用 Q() 表达式,特别是如果你需要 and/or 逻辑:
filterQuery = Q()
filterQuery = filterQuery | Q(agent='John')
filterQuery = filterQuery & Q(time__gte=timezone.now())
...
MyModel.objects.filter(filterQuery)
如何在 Django 中创建虚拟过滤器查询(始终匹配的过滤器)和从不匹配的排除查询。原因是因为在某些情况下我的查询是 None,在这些情况下我想使用虚拟过滤器。这是代码:
MyModel.objects.filter(filterQuery).exclude(excludeQuery)
在 filterQuery
或 excludeQuery
是 None
的情况下,我得到一个错误,所以我想在该查询之前添加以下条件:
if filterQuery == None: filterQuery = ???
if excludeQuery == None: excludeQuery = ???
MyModel.objects.filter(filterQuery).exclude(excludeQuery)
您应该只在需要时 filter/exclude 执行此操作,而不是使用空语句:
found = MyModel.objects.all()
if filterQuery:
found = found.filter(filterQuery)
if excludeQuery:
found = found.exclude(excludeQuery)
最好的方法是使用字典,尤其是当您有复杂的过滤器时。
filterQuery = excludeQuery = {}
# optionally set the filters based on some logic
if 1==1:
filterQuery['agent'] = 'John'
if 2==2:
excludeQuery['user_id__in'] = [1, 2]
if 3==3:
filterQuery['time__gte'] = timezone.now()
MyModel.objects.filter(**filterQuery).exclude(**excludeQuery)
您可以像 Shang 建议的那样添加一些 ifs 以查看是否需要应用过滤器,但我怀疑性能损失很大并且这更具可读性。
我上面的回答的另一种选择是使用 Q() 表达式,特别是如果你需要 and/or 逻辑:
filterQuery = Q()
filterQuery = filterQuery | Q(agent='John')
filterQuery = filterQuery & Q(time__gte=timezone.now())
...
MyModel.objects.filter(filterQuery)