Django4.0 管理器-创建带有QuerySet方法的管理器
要替换前面的要求复制 QuerySet
和 Manager
方法的方案, 可以用 QuerySet.as_manager()
创建一个 Manager
实例,拷贝了自定义 QuerySet
的方法:
class Person(models.Model):
...
people = PersonQuerySet.as_manager()
由 QuerySet.as_manager()
创建的 Manager
实例实质上等价于前面例子中的 PersonManager
。
不是每个 QuerySet
方法在 Manager
层都是有意义的;例如,我们故意阻止 QuerySet.delete()
被拷贝进 Manager
类中。
方法拷贝规则如下:
- 公开方法默认会被拷贝。
- 私有方法(以下划线打头)默认不会被复制。
-
queryset_only
属性值为 False
的方法总是会被复制。 -
queryset_only
属性值为 True
的方法永远不会被复制。
例如:
class CustomQuerySet(models.QuerySet):
# Available on both Manager and QuerySet.
def public_method(self):
return
# Available only on QuerySet.
def _private_method(self):
return
# Available only on QuerySet.
def opted_out_public_method(self):
return
opted_out_public_method.queryset_only = True
# Available on both Manager and QuerySet.
def _opted_in_private_method(self):
return
_opted_in_private_method.queryset_only = False
from_queryset()
classmethod from_queryset(queryset_class)
对于进阶用法,你可能同时要一个自定义 Manager
和一个自定义 QuerySet
。你可以通过调用 Manager.from_queryset()
达成目的,这将会返回一个自定义基础 Manager
的子类,带有一份自定义 QuerySet
方法的拷贝:
class CustomManager(models.Manager):
def manager_only_method(self):
return
class CustomQuerySet(models.QuerySet):
def manager_and_queryset_method(self):
return
class MyModel(models.Model):
objects = CustomManager.from_queryset(CustomQuerySet)()
还可以将生成的类存储到变量中:
MyManager = CustomManager.from_queryset(CustomQuerySet)
class MyModel(models.Model):
objects = MyManager()