阅读(4209) (0)

Django4.0 管理器-创建带有QuerySet方法的管理器

2022-03-15 09:56:52 更新

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