要替换前面的要求复制 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
对于进阶用法,你可能同时要一个自定义 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()
备案信息: 粤ICP备15087711号-2
Copyright © 2008-2024 啊嘎哇在线工具箱 All Rights.
本站所有资料来源于网络,版权归原作者所有,仅作学习交流使用,如不慎侵犯了您的权利,请联系我们。