使用as_manager覆盖默认查询集

时间:2017-09-10 21:32:47

标签: django

Django文档声明我们可以使用manager的get_queryset方法覆盖默认查询集。

如果我使用models.Queryset和as.manager方法来避免重复的方法怎么办?如何覆盖默认查询?

似乎是模型的get_queryset方法。在这种情况下,查看似乎并不起作用。

感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用ManagerQuerySet的组合来实现此目标,如下所示:

# model_managers.py
class CustomManager(models.Manager):
    """ Enables changing the default queryset function. """

    def get_queryset(self):
        # Here you can change the default queryset function
        return super(CustomManager, self).get_queryset(example_field=True)


class CustomQuerySet(models.QuerySet):
    """ Include additional queryset functions. """

    def example_filter(self):
        return self.filter(other_field=False)


# models.py
class YourModel(models.Model):

    # Override the default manager
    objects = CustomManager.from_queryset(CustomQuerySet)()  # The pair of empty parenthesis is required!

然后你可以在任何地方使用它:

# Will filter `example_field`
YourModel.objects.all()
# Will filter `example_field` and `other_field`
YourModel.objects.example_filter()

答案 1 :(得分:0)

您可以通过继承models.Manager来创建管理类,然后您可以定义自己的查询集方法。

在model.py中,我们应该将class赋值为以下给出的属性:

example = ExampleManager()

现在我们可以使用example而不是对象,并可以调用相应的ExampleManager方法。

答案 2 :(得分:0)

你应该展示你尝试过的没有用的东西。

但是,你只需要使用该调用在模型中定义自己的经理:

class MyModel(models.Model):
    ...
    objects = MyQuerySet.as_manager()