Molto spesso vedo costrutti comeDjango ORM - objects.filter() vs. objects.all(). Filter() - quale è il preferito?
MyModel.objects.all().filter(...)
, che restituirà un QuerySet del Mananger default. Dapprima all()
sembra essere piuttosto ridondante, perché
MyMode.objects.filter(...)
batte lo stesso risultato.
Tuttavia, questo sembra essere salvo solo il manager di default, a causa dei seguenti due affermazioni nella documentazione Django:
Estratto Fromt il capitolo "Aggiunta di metodi gestore aggiuntivi"
Una consuetudine Il metodo Manager può restituire tutto ciò che vuoi. Non ha per restituire un QuerySet.
Definizione del metodo all()
manager:
tutti() Restituisce una copia della QuerySet corrente (o QuerySet sottoclasse). Questo può essere utile in situazioni in cui è possibile passare in un gestore modelli o un QuerySet e filtrare ulteriormente sul risultato . Dopo aver chiamato all() su entrambi gli oggetti, avrai sicuramente un QuerySet con cui lavorare.
Questo mi sembra un po 'come una contraddizione. Django offre da una parte la libertà di consentire a un metodo manager di restituire qualsiasi cosa sia preferibile e dall'altra richiede un QuerySet per il metodo all()
. Sono a conoscenza del fatto che ogni manager ha un metodo get_queryset
chiamato da all()
. Ma chi mi impedisce di ignorare lo all()
nel mio gestore personalizzato? Anche se sono d'accordo, sarebbe un cattivo design farlo.
Quindi, per quanto posso vedere, il metodo
all()
non garantisce per restituire un QuerySet. Cosa restituisce esattamenteMyModel.objects
? Questa affermazione chiamaall()
? o `get_queryset()?Preferisci
MyModel.objects.filter(...)
oMyModel.objects.all().filter(...)
. E se sì, perché?Avete mai incontrato manager sbalorditi che avrebbero combinato con quei metodi in modo indesiderato?
Grazie per me riferimenti di origine. Questo ha spiegato molto. Questo mi ha aiutato a capire molto più le domande di django! –
Hai risposto alla tua domanda? Potresti considerare di accettare questa risposta? http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – rednaw