2009-03-23 29 views
6

Gibt es in Django eine Standardmethode zum Schreiben komplexer, benutzerdefinierter Filter für QuerySets?Django Custom Queryset-Filter

Wie kann ich schreiben

MyClass.objects.all().filter(field=val) 

Ich möchte so etwas wie dies zu tun:

MyClass.objects.all().filter(customFilter) 

ich einen Generator Ausdruck

(x for x in MyClass.objects.all() if customFilter(x)) 

verwenden könnte, aber das würde verlieren die Verkettbarkeit und alle anderen Funktionen, die die QuerySets bieten.

Antwort

5

Ich denke, Sie benötigen möglicherweise benutzerdefinierte managers.

+0

Ich denke, ich brauche das. Aber es sieht furchtbar kompliziert aus verglichen mit der Möglichkeit, eine Filterfunktion im laufenden Betrieb zu übergeben. – interstar

+0

Es ist nicht sehr kompliziert, und es ist eine gute Praxis, benutzerdefinierte Manager zu machen, besonders wenn Sie planen, Sachen von db usw. zu cachen. – Vasil

13

Die Empfehlung, mit der Verwendung von Manager-Methoden zu beginnen, ist eine gute, aber um Ihre Frage direkter zu beantworten: Ja, verwenden Sie Q objects. Zum Beispiel:

from django.db.models import Q 

complexQuery = Q(name__startswith='Xa') | ~Q(birthdate__year=2000) 

MyModel.objects.filter(complexQuery) 

Q-Objekte können mit | kombiniert werden (OR), & (UND) und ~ (NICHT).