Sehr oft sehe ich Konstrukte wieDjango ORM - objects.filter() vs. objects.all(). Filter() - welche wird bevorzugt?
MyModel.objects.all().filter(...)
, die eine QuerySet des Standard Mananger zurück. Auf den ersten all()
scheint ziemlich überflüssig zu sein, weil
MyMode.objects.filter(...)
das gleiche Ergebnis liefert.
Dies scheint jedoch nur für den Standard-Manager zu speichern, weil der beiden folgenden Anweisungen in der Dokumentation Django:
Auszug Fromt Kapitel „Hinzufügen zusätzlicher Manager-Methoden“
Eine benutzerdefinierte Manager-Methode kann alles zurückgeben, was Sie möchten. Es hat nicht, um ein QuerySet zurückzugeben.
Definition der all()
Manager Methode:
alle() eine Kopie des aktuellen QuerySet Returns (oder QuerySet Unterklasse). Dies kann in Situationen nützlich sein, in denen Sie möglicherweise entweder einen Modellmanager oder ein QuerySet übergeben und weitere Filterungen für das Ergebnis durchführen möchten. Nachdem Sie alle() auf einem der Objekte aufgerufen haben, haben Sie definitiv einen QuerySet, mit dem Sie arbeiten können.
Das scheint ein bisschen wie ein Widerspruch zu mir. Auf der einen Seite bietet Django die Freiheit, eine Manager-Methode beliebig zurückgeben zu lassen, und auf der anderen Seite benötigt es ein QuerySet für die all()
-Methode. Ich bin mir bewusst, dass jeder Manager eine get_queryset
-Methode hat, die von all()
aufgerufen wird. Aber wer hält mich davon ab, all()
in meinem benutzerdefinierten Manager zu überschreiben? Obwohl ich zustimme, wäre es ein schlechtes Design, dies zu tun.
So soweit ich sehen kann, ist die
all()
Methode garantiert keine QuerySet zurückzukehren. Was genau gibtMyModel.objects
zurück? Ruft diese Anweisungall()
auf? oder `get_queryset()?Sie bevorzugen
MyModel.objects.filter(...)
oderMyModel.objects.all().filter(...)
. Und wenn ja, warum?Haben Sie jemals wackelige Manager getroffen, die diese Methoden in einer unerwünschten Weise durcheinander bringen würden?
Vielen Dank für mich Quellenangaben. Das hat viel erklärt. Das hat mir geholfen, Django-Anfragen viel besser zu verstehen! –
Hat dies Ihre Frage beantwortet? Könnten Sie diese Antwort akzeptieren? http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – rednaw