Gibt es eine Möglichkeit, eine Abfrage durchzuführen und eine Liste von Dingen auszuschließen, anstatt mehrere Male auszuschliessen?Django Objekt multiple exclude()
Antwort
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?
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.
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
Können Sie bitte erklären, was Sie mit "Abfragen sind faul" und "ziehen Daten daraus" meinen? Thnx – akki
Was bedeutet faul bedeutet, dass keine Daten aus der Datenbank abgerufen werden, bis die Abfrage tatsächlich verwendet wird. –
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)
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)
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)
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