Django对象多重排除()

Joh*_*hnd 21 django django-queryset

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

Dan*_*man 40

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

names_to_exclude = [o.name for o in objects_to_exclude] 
Foo.objects.exclude(name__in=names_to_exclude)
Run Code Online (Sandbox Code Playgroud)

这样做你想要的吗?


Ned*_*der 8

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

  • 懒惰的意思是在实际使用查询之前不会从数据库中提取任何数据。 (4认同)

Bha*_*and 8

你也可以尝试这个。

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


tgh*_*ghw 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)
Run Code Online (Sandbox Code Playgroud)

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

qs = Foo.objects.all()
for tag in ignored_tags:
    qs = qs.exclude(tag=tag)
Run Code Online (Sandbox Code Playgroud)