Django ORM - objects.filter () vs. objects.all (). Filter () - qual é o preferido?

Muitas vezes vejo construções como

MyModel.objects.all().filter(...)

que retornará um QuerySet do Mananger padrão. No inícioall() parece ser bastante redundante, porque

MyMode.objects.filter(...)

fornece o mesmo resultado.

No entanto, isso parece ser seguro apenas para o Gerenciador padrão, devido às duas instruções a seguir na documentação do Django:

Trecho do capítulo "Adicionando métodos extras de gerenciamento"

Um método Manager personalizado pode retornar o que você quiser. Não precisa retornar um QuerySet.

Definição doall() método de gerenciamento:

all () Retorna uma cópia do QuerySet atual (ou da subclasse QuerySet). Isso pode ser útil em situações nas quais você pode passar um gerente de modelo ou um QuerySet e fazer uma filtragem adicional no resultado. Depois de chamar all () em qualquer objeto, você definitivamente terá um QuerySet para trabalhar.

Isso parece um pouco como uma contradição para mim. Por um lado, o Django oferece a liberdade de permitir que um método gerenciador retorne qualquer tipo de objeto preferido e, por outro lado, requer um QuerySet para o métodoall() método. Estou ciente de que cada gerente tem umget_queryset método que é chamado porall(). Mas quem me impede de substituirall() no meu gerente personalizado? Embora eu concorde, seria um projeto ruim fazer isso.

Então, tanto quanto eu posso ver, oall() O método não garante retornar um QuerySet. O que exatamente fazMyModel.objects Retorna? Esta declaração chamaall()? ou `get_queryset ()?

Você prefereMyModel.objects.filter(...) ouMyModel.objects.all().filter(...). E se sim, por quê?

Você já encontrou gerentes instáveis que mexeriam com esses métodos de maneira indesejável?

questionAnswers(3)

yourAnswerToTheQuestion