2009-04-20 6 views
30

Wie erstelle ich einen UND-Filter, um Objekte in Django abzurufen? Ich möchte z. B. eine Zeile abrufen, die eine Kombination aus zwei Wörtern in einem einzelnen Feld enthält.Wie verwende ich UND in einem Django-Filter?

Zum Beispiel die folgende SQL-Abfrage genau das tut, wenn ich es auf MySQL-Datenbank ausführen:

select * from myapp_question 
where ((question like '%software%') and (question like '%java%')) 

Wie erreichen Sie diese in Django Filter verwenden?

Antwort

59
mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar") 

Update: Lange Zeit, da ich diese Antwort schrieb und einige django getan, aber ich bin sicher, dass zu diesem Tage der beste Ansatz ist es, die Q-Objektmethode wie David Berger zu verwenden, zeigt sich hier: stackoverflow.com/ a/770078/63097

+3

Dies funktioniert _not_ nicht für mich in Django 1.6 und Postgres. Ich erhalte ein "SyntaxError: keyword argument repeated" immer dann, wenn zwei oder mehr gleiche Keywords vorhanden sind. Nur die Lösung mit Q von David Berger funktioniert. – margusholland

+0

@margusholland Die Antwort funktioniert bei mir mit Django 1.6 & Postgres. Können Sie Ihre Anfrage posten? Es ist so offiziell wie die Q-Objekt-Methode. https://docs.djangoproject.com/de/dev/topics/db/queries/#panning-multi-valued-relationships – Medorator

+1

Ich habe ein Model Land mit einem kurzen Ländercode Feld (cc_short): >>> Länder = Country.objects.filter (cc_short__icontains = 'A', cc_short__icontains = 'B') Datei "", Zeile 1 SyntaxError: Schlüsselwort Argument wiederholt – margusholland

10

Sie können Kette Filterausdrücke in Django:

q = Question.objects.filter(question__contains='software').filter(question__contains='java') 

Sie können weitere Informationen in den Django docs auf "Chaining Filters" finden.

+2

Diese Antwort kann Ihnen falsche Ergebnisse abhängig von Ihrem Szenario geben. Die Verwendung von ',' in Filter vs Verkettungsfilter kann unterschiedliche Ergebnisse haben. Weiterführende Literatur: [SO Answer] (http://stackoverflow.com/a/11025652/781695) & [Offizielle Dokumente] (https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning -mehrwertige Beziehungen) – Medorator

57

Für Gründlichkeit willen, lassen Sie sich einfach die Methode Q Objekt erwähnen:

from django.db.models import Q 
criterion1 = Q(question__contains="software") 
criterion2 = Q(question__contains="java") 
q = Question.objects.filter(criterion1 & criterion2) 

Beachten Sie die anderen Antworten hier sind einfacher und besser für Ihren Anwendungsfall angepasst, aber wenn jemand mit einem ähnlichen, aber etwas komplexeres Problem (wie "not" oder "or") sieht dies, es ist gut, die Referenz hier zu haben.

+0

Sehr interessant! –

+0

Ich wollte nur erwähnen, dass Ihr vorbeikommender Kommentar mir geholfen hat. Vielen Dank! – Alfonsol

Verwandte Themen