28

有没有办法进行查询并排除事物列表,而不是多次调用排除?

4

5 回答 5

51

根据您对 Ned 的回复,您似乎只想排除标签列表。所以你可以只使用in过滤器:

names_to_exclude = [o.name for o in objects_to_exclude] 
Foo.objects.exclude(name__in=names_to_exclude)

这样做是你想要的吗?

于 2009-05-26T21:28:09.623 回答
9

多次调用 exclude 有什么问题?查询是惰性的,除非您尝试从中提取数据,否则不会发生任何事情,因此多次使用 .exclude() 没有任何缺点。

于 2009-05-26T20:27:36.437 回答
7

你也可以试试这个。

exclude_list = ['A', 'B', 'C'] qs = Foo.objects.exclude(items__in=exclude_list)

于 2017-10-10T07:23:53.543 回答
5

你可以用Q 对象很容易地做到这一点:

from django.db.models import Q

excludes = None
for tag in ignored_tags:
    q = Q(tag=tag)
    excludes = (excludes and (excludes | q)) or q # makes sure excludes is set properly
set_minus_excluded = Foo.objects.exclude(excludes)

您还应该能够使用 exclude() 动态执行此操作:

qs = Foo.objects.all()
for tag in ignored_tags:
    qs = qs.exclude(tag=tag)
于 2009-05-26T21:06:50.773 回答
4

为了改进 Daniel Roseman 的回答,我认为最好直接从查询集中获取所需的值,而不是在大型数据集上可能很昂贵的 for 循环,即

names_to_exclude = objects_to_exclude.values_list('name')
Foo.objects.exclude(name__in=names_to_exclude)
于 2017-01-20T06:47:00.317 回答