Django对象多重排除()

时间:2009-05-26 20:22:07

标签: django django-queryset

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

5 个答案:

答案 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)