【发布时间】:2010-10-29 02:12:42
【问题描述】:
有没有办法进行查询并排除事物列表,而不是多次调用 exclude?p>
【问题讨论】:
有没有办法进行查询并排除事物列表,而不是多次调用 exclude?p>
【问题讨论】:
根据您对 Ned 的回复,您似乎只想排除标签列表。所以你可以只使用in 过滤器:
names_to_exclude = [o.name for o in objects_to_exclude]
Foo.objects.exclude(name__in=names_to_exclude)
这样做是你想要的吗?
【讨论】:
多次调用 exclude 有什么问题?查询是惰性的,除非您尝试从中提取数据,否则不会发生任何事情,因此多次使用 .exclude() 没有任何缺点。
【讨论】:
你也可以试试这个。
exclude_list = ['A', 'B', 'C']
qs = Foo.objects.exclude(items__in=exclude_list)
【讨论】:
您可以使用Q object 轻松做到这一点:
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)
【讨论】:
为了改进 Daniel Roseman 的回答,我认为最好直接从查询集中获取您需要的值,而不是在大型数据集上可能很昂贵的 for 循环,即
names_to_exclude = objects_to_exclude.values_list('name')
Foo.objects.exclude(name__in=names_to_exclude)
【讨论】: