Django自定义model.Manager,因此它接受参数

时间:2013-10-29 18:16:45

标签: django django-models

如果可能的话,我希望能够通过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。

1 个答案:

答案 0 :(得分:1)

您需要向管理器添加__call__方法,该方法接受此参数并返回不同的查询集,然后返回默认管理器(或基于参数的其他管理器)。

您最好编写自定义查询集方法并返回它们。查询集被设计为链接,因此您不必继续传递相同的参数。

如果添加特定用例,我可以向您展示如何使用自定义Manager和/或QuerySet类构建它。