codecamp

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()


Django4.0 管理器-管理器调用自定义QuerySet方法
Django4.0 管理器-自定义管理器和模型继承
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Django4.0 模型和数据库

Django4.0 处理HTTP请求

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }