Bardzo często widzę konstrukcje jakDjango ORM - objects.filter() vs. objects.all(). Filter() - który z nich jest preferowany?
MyModel.objects.all().filter(...)
który zwróci QuerySet domyślnego Mananger. Początkowo all()
wydaje się być zupełnie zbędne, ponieważ
MyMode.objects.filter(...)
dostarcza ten sam rezultat.
to jednak wydaje się być wyjątkiem domyślnego tylko Managera, ponieważ z dwóch poniższych stwierdzeń zawartych w dokumentacji Django:
Fragment fromt rozdziale „Dodawanie dodatkowych metod Manager”
niestandardową Metoda menedżera może zwrócić wszystko, co chcesz. Nie ma ona , aby zwrócić zestaw kwerend.
Definicja metody all()
Manager:
wszystko() Zwraca kopię bieżącego queryset (lub queryset podklasy). Może to być przydatne w sytuacjach, w których warto przekazać albo menedżera modelu lub QuerySet i wykonać dalsze filtrowanie wyniku . Po wywołaniu all() na dowolnym obiekcie, na pewno będziesz miał do pracy zestaw kwerend .
To wydaje się trochę sprzeczne ze mną. Z jednej strony Django daje swobodę, aby metoda menedżera mogła zwracać dowolne, a z drugiej strony wymaga zestawu QuerySet dla metody all()
. Mam świadomość, że każdy menedżer ma metodę get_queryset
, która jest wywoływana przez all()
. Ale kto powstrzymuje mnie przed przesłonięciem all()
w moim menedżerze niestandardowym? Chociaż zgadzam się, byłoby to złe.
Więc o ile widzę, metoda
all()
nie gwarantuje powrotu QuerySet. Co dokładnie zwracaMyModel.objects
? Czy to stwierdzenie wywołujeall()
? lub `get_queryset()?Czy wolisz
MyModel.objects.filter(...)
lubMyModel.objects.all().filter(...)
. A jeśli tak, dlaczego?Czy spotkałeś kiedyś nieudolnych menedżerów, którzy bałaganią tymi metodami w niepożądany sposób?
Dziękuję za referencje źródłowe. To bardzo wyjaśniało. Pomogło mi to zrozumieć kwerendy django o wiele więcej! –
Czy to była odpowiedź na twoje pytanie? Czy możesz rozważyć zaakceptowanie tej odpowiedzi? http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – rednaw