Django4 中文入门教程 Django4.0 管理器-创建带有QuerySet方法的管理器

2024-02-25 开发教程 Django4 中文入门教程 匿名 5

要替换前面的要求复制 ​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()