2009-05-26 8 views

答えて

28

をベースに、あなたは単にタグのリストを除外したいと思うように聞こえます。したがって、inフィルタを使用することができます:

names_to_exclude = [o.name for o in objects_to_exclude] 
Foo.objects.exclude(name__in=names_to_exclude) 

あなたはそれが欲しいですか?

+0

私はオブジェクトのリストを直接削除します。私はo.nameを使用しません。 ignore_tags = request.user.ignore_tags.all() case_list = Case.objects.exclude(tags__in = ignore_tags)) – Johnd

3

複数回除外を呼び出すと何が問題になりますか?クエリは怠惰で、データを取得するまで何も起こらないので、.exclude()を複数回使用することには欠点はありません。

+0

私は、タグmanytomanyフィールドを持つモデルを持っています。ユーザーは大量の無視タグを持つことができます。私は、ユーザーが見たくないオブジェクトを動的に除外したい。実行時間までに何回呼び出すかわからない。 – Johnd

+0

「クエリが怠惰である」と「それからデータを引き出す」という意味を説明してください。 Thnx – akki

+1

怠け者とは、クエリが実際に使用されるまでデータがデータベースから取得されないということです。 –

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) 

ます。また、)(除外と動的にそれを行うことができる必要があります:ネッドへの返信に

qs = Foo.objects.all() 
for tag in ignored_tags: 
    qs = qs.exclude(tag=tag) 
0

私は大規模なデータセットは、IEに高価になる可能性がありますが、forループの代わりに、クエリセットから直接、必要な値を取得する方が良いと思いダニエルローズマンの答えを改善する

names_to_exclude = objects_to_exclude.values_list('name') 
Foo.objects.exclude(name__in=names_to_exclude) 
-1

あなたが試すことができますこれもまた。

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

関連する問題