我经常看到像这样的结构
MyModel.objects.all().filter(...)
Run Code Online (Sandbox Code Playgroud)
这将返回默认Mananger的QuerySet.起初all()似乎是多余的,因为
MyMode.objects.filter(...)
Run Code Online (Sandbox Code Playgroud)
提供相同的结果.
但是,这对于默认的Manager似乎是安全的,因为Django文档中有以下两个语句:
摘自"添加额外管理器方法"一章
自定义Manager方法可以返回您想要的任何内容.它不必返回QuerySet.
all()经理方法的定义:
all()返回当前QuerySet(或QuerySet子类)的副本.这在您可能希望传入模型管理器或QuerySet并对结果进行进一步过滤的情况下非常有用.在任一对象上调用all()之后,你肯定会有一个QuerySet来使用.
这似乎有点像我的矛盾.一方面,Django提供了让管理器方法返回任何首选对象类型的自由,另一方面它需要一个QuerySet用于该all()方法.我知道每个经理都有一个get_queryset被调用的方法all().但谁阻止我压倒all()我的自定义经理?虽然我同意这样做是不好的设计.
所以据我所知,该all()方法不保证返回QuerySet.到底是什么MyModel.objects回报?这句话是否要求all()?还是`get_queryset()?
你喜欢MyModel.objects.filter(...)还是MyModel.objects.all().filter(...).如果是这样,为什么?
您是否曾遇到过那些会以不合需要的方式搞乱这些方法的经理?