很多时候我看到像这样的结构
MyModel.objects.all().filter(...)
这将返回默认 Mananger 的 QuerySet。起初all()
似乎相当多余,因为
MyMode.objects.filter(...)
提供相同的结果。
但是,这似乎只对默认的 Manager 是安全的,因为 Django 文档中有以下两个语句:
摘自“添加额外的管理器方法”一章
自定义 Manager 方法可以返回您想要的任何内容。它不必返回 QuerySet。
all()
管理器方法的定义:
all() 返回当前 QuerySet(或 QuerySet 子类)的副本。这在您可能想要传入模型管理器或 QuerySet 并对结果进行进一步过滤的情况下很有用。在对任一对象调用 all() 之后,您肯定会有一个 QuerySet 可以使用。
这对我来说似乎有点矛盾。一方面,Django 提供了让管理器方法返回任何首选对象类型的自由,另一方面它需要该all()
方法的 QuerySet。我知道每个经理都有一个get_queryset
由all()
. 但是谁阻止我all()
在我的自定义管理器中覆盖?尽管我同意这样做是不好的设计。
据我所知,该
all()
方法并不能保证返回一个 QuerySet。究竟MyModel.objects
返回什么?这句话叫all()
吗?或`get_queryset()?你喜欢
MyModel.objects.filter(...)
还是MyModel.objects.all().filter(...)
。如果是这样,为什么?你有没有遇到过不可靠的经理,他们会以一种不受欢迎的方式搞乱这些方法?