2010-03-22 9 views
20

Ich habe ein 'abgebrochenes' Feld zu meinem Modell hinzugefügt, gibt es eine Möglichkeit, die Modell-Standardabfrage zu etwas wie abgebrochen zu ändern = Falsch? ohne alle meine Filter/Ausschluss-Abfragen zu ändern?Standard-Abfrage-Set in Django ändern

Antwort

29

Sie können dies mit einem benutzerdefinierten Modellmanager durchführen und die get_queryset-Funktion überschreiben, um immer abgebrochen = False zu filtern.

Wenn dann MyModel.objects.all() aufgerufen wird, werden abgebrochene Objekte immer ausgeschlossen. Hier ist ein Blogbeitrag, den ich zu dem Thema hilfreich fand. http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/

EDIT: Vielleicht ein besserer Ansatz mit einem benutzerdefinierten Manager wäre es als Objekte auf eine andere Eigenschaft, andere zu befestigen, wie zum Beispiel:

class MyModel(models.Model): 
    # Blah blah 
    active = CustomManager() 

Und in Ihre Ansichten Ihre Anfragen wie MyModel.active.all() aussehen würde.

EDIT2: Aktualisierte Methode Rechtschreibung von zu get_queryset für moderne Versionen von Django.

+2

Sie müssen SEHR SEHR vorsichtig mit dem Überschreiben von Standard-Manager einfach so sein. In diesem speziellen Fall wird der einmal gelöschte Gegenstand nie mit filter()/get() gefunden. –

+1

Einverstanden. Würde ich diesen Ansatz in der Regel durch Überschreiben von get() ergänzen, um diesen Filter nicht zu verwenden, wenn pk angegeben wird. Wahrscheinlich möchten Sie auch das Admin-Abfrage-Set so ändern, dass alle einschließlich abgebrochen zurückgegeben werden. Wenn Sie in Ihren Abfragen jedoch selten abgebrochene Elemente wünschen, kann dies ein sinnvoller Ansatz sein. –

+1

Hallo, gibt es eine Möglichkeit, das Verhalten von get_query_set zu ändern, um zusätzliche Parameter zu verwenden, d. H. Von irgendwoher weitergegeben, oder globale Variablen wie aktuelle Login-Benutzerinformationen zu verwenden? Vielen Dank! – ultrajohn

4

Sie könnten benutzerdefinierte query manager schreiben, aber ich glaube nicht, dass dies der richtige Weg ist. Dies würde eine implizite, versteckte Bedingung für einen Filter darstellen, die Code unlesbar machen würde. Erinnere dich Zen von Python: Explicit is better than implicit. Ermitteln Sie Orte, an denen Sie abgebrochene hinzufügen müssen = False und fügen Sie einfach das hinzu, so sollten Sie dies tun.

+5

Ich stimme überhaupt nicht zu. Was wäre dann der Zweck, benutzerdefinierte Manager zu haben? Was ist so implizit über 'not_cancelled = CustomManager()' und dann über MyModel.not_cancelled.all()? – jonwd7