There's a couple reasons that's not ideal.
The big one is that you'd lose filter chaining. With your example you couldn't do
Todo.objects.high_priority().incomplete()
The other issue is a semantic one. In your example you could do: Todo.objects.all()[0].incomplete()
which will return a QuerySet of all incomplete Todo items. This, at least to me, doesn't make sense.The last reason is that by using a Manager you are encapsulating this filter data. If you later decide that you want to create a new model with similar types of filters, then you'd have to rewrite these methods. With a Manager, both models can simply use the same manager.