有没有办法进行查询并排除事物列表,而不是多次调用排除?
答案 0 :(得分:35)
根据你对Ned的回复,听起来你只想排除一个标签列表。所以你可以使用in
过滤器:
names_to_exclude = [o.name for o in objects_to_exclude]
Foo.objects.exclude(name__in=names_to_exclude)
这样做你想要的吗?
答案 1 :(得分:4)
多次呼叫排除有什么问题?查询是懒惰的,在您尝试从中提取数据之前没有任何反应,因此不止一次使用.exclude()没有任何缺点。
答案 2 :(得分:4)
您可以使用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)
答案 3 :(得分:1)
为了改进Daniel Roseman的答案,我认为最好直接从查询集中获取所需的值,而不是在大数据集上可能很昂贵的for循环,例如。
names_to_exclude = objects_to_exclude.values_list('name')
Foo.objects.exclude(name__in=names_to_exclude)
答案 4 :(得分:1)
你也可以尝试一下。
exclude_list = ['A', 'B', 'C']
qs = Foo.objects.exclude(items__in=exclude_list)