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()を複数回使用することのデメリットはありません。

于 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 に答える