2009-05-26 3 views

ответ

28

Основываясь на вашем ответе на Неда, он похоже, что вы просто хотите исключить список тегов. Таким образом, вы могли бы просто использовать in фильтр:

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

ли это делать то, что вы хотите?

+0

Я делаю это со списком objects_to_exclude напрямую, я не использую o.name: ignore_tags = request.user.ignore_tags.all() case_list = Case.objects.exclude (tags__in = ignore_tags)) – Johnd

3

Что случилось с вызовом exclude несколько раз? Запросы ленивы, ничего не происходит, пока вы не попытаетесь извлечь данные из него, поэтому нет недостатка в использовании .exclude() более одного раза.

+0

У меня есть модель, у которой есть метки manytomany field. пользователь может иметь большое количество тегов игнорирования. Я хочу динамически исключать объекты, которые пользователь не хочет видеть. Я не буду знать, сколько раз вызывать исключение до запуска. – 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

Чтобы улучшить ответ Daniel Роземан, я думаю, что было бы лучше, чтобы получить необходимые значения непосредственно из QuerySet вместо того, чтобы за цикл, который может быть дорогим на больших наборов данных, т.е.

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)