2009-05-26 4 views

Antwort

28

Basierend auf Ihrer Antwort auf Ned, es klingt so, als wolle man nur eine Liste von Tags ausschließen. So konnte man nur verwenden, um die in Filter:

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

das tut, was Sie wollen?

+0

Ich mache es mit einer Liste von objects_to_exclude direkt, ich verwende nicht den o.name: ignore_tags = request.user.ignore_tags.all() case_list = Case.objects.exclude (tags__in = ignore_tags)) – Johnd

3

Was ist falsch mit Anruf ausschließen mehrere Male? Abfragen sind faul, es passiert nichts, bis Sie versuchen, Daten daraus zu ziehen. Es gibt also keinen Nachteil, wenn Sie .exclude() mehr als einmal verwenden.

+0

Ich habe ein Modell, das eine Tags hat manytomany Feld. Der Benutzer kann eine große Anzahl von Ignorier-Tags haben. Ich möchte die Objekte dynamisch ausschließen, die der Benutzer nicht sehen möchte. Ich werde nicht wissen, wie oft Anrufe bis zur Laufzeit ausschließen. – Johnd

+0

Können Sie bitte erklären, was Sie mit "Abfragen sind faul" und "ziehen Daten daraus" meinen? Thnx – akki

+1

Was bedeutet faul bedeutet, dass keine Daten aus der Datenbank abgerufen werden, bis die Abfrage tatsächlich verwendet wird. –

4

Sie können es ziemlich leicht mit den 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) 

Sie sollten auch in der Lage sein, dynamisch zu tun mit auszuschließen():

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

auf die Antwort von Daniel Roseman Zur Verbesserung der ich denke, es wäre besser, die Werte, die Sie direkt anstelle der for-Schleife aus dem queryset müssen zu erhalten, die auf Sätze

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

Sie können versuchen, dh große Daten teuer sein könnte das auch.

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