如果可能的话,我希望能够通过objects
传递args或kwargs,并且没有不必要的复杂情况。它看起来像Model.objects('something').all()
或Model.objects('something').order_by('field')
。我尝试为AManager自定义__init__
,但无法使其工作,因此可能与编写相应的__init__
函数一样简单。
我所做的是向自定义管理器添加一个方法,如下所示:
class AManager(models.Manager):
def example(self, arg):
self.example = arg
return self
class A(models.Model):
name = models.Charfield()
objects = AManager()
在此示例中,A.objects.example('name').all()
将返回通常的A.objects.all()
,除非example('name')
以某种方式影响QuerySet。我想做的是避免像A.objects.custom_filter('name').another_filter('name')
这样的东西,我必须为每个链式过滤器包含一个重复的arg。
答案 0 :(得分:1)
您需要向管理器添加__call__
方法,该方法接受此参数并返回不同的查询集,然后返回默认管理器(或基于参数的其他管理器)。
您最好编写自定义查询集方法并返回它们。查询集被设计为链接,因此您不必继续传递相同的参数。
如果添加特定用例,我可以向您展示如何使用自定义Manager和/或QuerySet类构建它。