Wann sollte ich ein custom-Manager im Vergleich zu einem custom-QuerySet in Django?
In Django, custom-Manager sind eine große Weise, sich zu organisieren wiederverwendbare query-Logik. Die docs Staat, der es gibt zwei Gründe, die Sie vielleicht anpassen möchten einen Manager: hinzufügen von zusätzlichen Manager-Methoden, und/oder zum ändern der anfänglichen QuerySet der Manager zurück.
Jedoches geht zu beschreiben, wie benutzerdefinierte QuerySets können auch erstellt werden, und dass diese zugänglich gemacht werden können direkt aus dem Datenmodell als manager über die QuerySet.as_manager()
. Die Manager-Instanz erstellt, indem QuerySet.as_manager() werden praktisch identisch mit dem des PersonManager aus dem vorherigen Beispiel.
Es scheint, wie es gibt eine Menge Flexibilität in, wie könnte man organisieren, Ihre Logik zwischen custom Manager und/oder benutzerdefinierte QuerySets. Kann jemand erklären die Prinzipien, nach denen ich entscheiden sollte, Wann eine im Vergleich zu den anderen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hauptsächlich ermöglichen eine einfache Komposition von Abfragen. Im Allgemeinen, wenn Sie wollen, können, führen eine operation auf einer vorhandenen queryset in einer Kette von queryset-Anrufe, die Sie verwenden können, eine
QuerySet
.Zum Beispiel, sagen, Sie haben eine
Image
Modell, daswidth
,height
Felder:könnten Sie schreiben, einige benutzerdefinierte
QuerySet
Methoden:jetzt können Sie leicht erstellen Sie dynamische querysets:
Logisch, diese Funktionen sollten sein befasst sich in Erster Linie mit der Partitionierung oder Neudefinition vorhandener querysets der queryset-Modell. Für Situationen, in denen Sie nicht den Betrieb auf bestehenden querysets, die Sie nicht wollen, um wieder eine queryset, oder haben Sie vielleicht führen einige Verwandte Logik, die sich nicht um dieses Modell, als ein Modell-manager besser geeignet.
objects
zuYourCustomQuerySet.as_manager()
. Dann brauchen Sie nur um die Abfrage zu erstellen gesetzt, Klasse. Siehe docs.djangoproject.com/en/dev/topics/db/managers/...objects = ImageManager()
zu denImage
- Modell, um für diese zu arbeiten?Hielt ich reteaching mich, was ist ein
Manager
vsQuerySet
so, dachte ich, besser hier zu schreiben, so machen es einfacher, das nächste mal Frage ich mich.Einen
Manager
ist die Klasse, die an deinem Modell und gibt einenQuerySet
Beispielobjects
als der Standard-manager. Die meisten manager Methoden, ex.all()
,filter()
Gegenzug queryset-Instanzen.Im detail, wenn Sie das tun
YourModel.objects.filter(..)
erhalten Sie ein queryset-Instanz. Wenn Sie möchten, filtern Sie es wieder, können Sie die Kette eine weitere.filter(..)
Methode nur, weil es auch auf derQuerySet
Klasse zu. Das ist das, was Sie wollen.. haben Ihre Methoden, auf die manager und die queryset zurückgegeben.Wenn
filter
war nicht auch eine manager-Methode, die Sie würde tun müssenYourModel.objects.all()
um die queryset, und dann fügen Sie diefilter
Methode(N) aus.Dinge einfach zu machen, Django definiert eine
as_manager()
Methode auf den QuerySet-Klasse, die wandelt es in ein, naja.., ein manager [docs]. Daher definieren Sie alle Ihre benutzerdefinierten Methoden auf Ihre queryset, und schalten Sie es in einen manager, und verbinden Sie Ihr Modell, so dass Sie können es nennen, das erste mal (als manager-Methode) und der Kette, so oft Sie wollen (wie queryset-Methoden).Schreiben dieser Antwort, fragte ich mich, ob es irgendwelche manager-Methoden geliefert, mit Django, die nicht queryset Methoden, und die erste, die mir in den Sinn kam, war die
get_or_create
Methode, da scheint es nicht zu brauchen, ein queryset. Aber wissen Sie was? auch stellte sich heraus definiert werden, auf dieQuerySet
Klasse.Lange Geschichte kurz zu, Sie fast immer wollen, schreiben QuerySet und Methoden haben Sie auf die manager auch über die
as_manager()
.