Die andere Option ist, dass, wenn Sie einen Filter haben, die Sie immer angewendet werden sollen, ein custom manager auf dem Modell in Frage hinzuzufügen, die immer den Filter gilt für die Ergebnisse zurückgegeben.
Ein gutes Beispiel hierfür ist ein Event
Modell, bei dem 90% der Abfragen, die Sie auf dem Modell tun Sie so etwas wie Event.objects.filter(date__gte=now)
, das heißt Sie sind normalerweise interessiert in Events
gehen zu wollen, die kommenden werden. Dies würde wie folgt aussehen:
class EventManager(models.Manager):
def get_query_set(self):
now = datetime.now()
return super(EventManager,self).get_query_set().filter(date__gte=now)
Und im Modell:
class Event(models.Model):
...
objects = EventManager()
Aber auch hier gilt den gleichen Filter gegen alle Standardabfragen auf das Event
Modell gemacht und so ist nicht so flexibel einig die oben beschriebenen Techniken.
from django import template
register = template.Library()
@register.assignment_tag
def query(qs, **kwargs):
""" template tag which allows queryset filtering. Usage:
{% query books author=author as mybooks %}
{% for book in mybooks %}
...
{% endfor %}
"""
return qs.filter(**kwargs)
Vielen Dank für die Klärung des Django-Designkonzeptes. Ich verwende den Modellmethodenansatz. – Ber
Hallo Leute ist 2014 jetzt! Ungefähr 6 Jahre später haben JS-Bibliotheken große Fortschritte gemacht, und das Filtern nicht extrem großer Datenmengen sollte eher auf Client-Seite erfolgen, mit Unterstützung einer netten Java-Skript-Bibliothek oder zumindest AJAX-ed. – andi
@andi: Ich stimme sicherlich sogar mit mäßig großen Datensätzen überein, z.B. sogar Tausende von Zeilen in einer Tabelle. Nachdem ich an Datenbanken mit Millionen von Zeilen gearbeitet habe, gibt es immer noch einen Platz für die serverseitige Filterung :) –