Django中的虚拟过滤器

时间:2015-07-27 23:09:30

标签: python django django-models django-queryset django-orm

如何在Django(始终匹配的过滤器)和从不匹配的排除查询中创建虚拟过滤器查询。原因是因为我的查询是None的情况,在这种情况下我想使用虚拟过滤器。这是代码:

MyModel.objects.filter(filterQuery).exclude(excludeQuery)

如果filterQueryexcludeQueryNone,我收到错误,因此我想在该查询之前添加以下条件:

if filterQuery == None: filterQuery = ???
if excludeQuery == None: excludeQuery = ???
MyModel.objects.filter(filterQuery).exclude(excludeQuery)

3 个答案:

答案 0 :(得分:1)

您应该只在需要时过滤/排除,而不是使用空语句,执行此操作:

found = MyModel.objects.all()
if filterQuery:
    found = found.filter(filterQuery)
if excludeQuery:
    found = found.exclude(excludeQuery)

答案 1 :(得分:0)

最好的方法是使用dict,特别是如果你有复杂的过滤器。

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,看你是否需要应用过滤器,但我怀疑是否有很多性能损失,而且更具可读性。

答案 2 :(得分:0)

上面我的回答的另一个替代方法是使用Q()表达式,特别是如果你需要和/或逻辑:

filterQuery = Q()

filterQuery = filterQuery | Q(agent='John')
filterQuery = filterQuery & Q(time__gte=timezone.now())

...

MyModel.objects.filter(filterQuery)