修改django中的默认查询集

时间:2010-03-22 17:48:12

标签: python django django-models metaprogramming

我在模型中添加了“已取消”字段,有没有办法将模型默认查询修改为cancelled = False?无需修改我的所有过滤/排除查询?

2 个答案:

答案 0 :(得分:33)

您可以使用自定义模型管理器执行此操作,并覆盖get_queryset函数以始终过滤已取消= False。

class CustomManager(models.Manager):
    def get_queryset(self):
        return super(CustomManager, self).get_queryset().filter(canceled=False)

class MyModel(models.Model):
    # Blah blah
    objects = CustomManager()

然后在调用MyModel.objects.all()时,它将始终排除已取消的对象。这是一篇我发现有用的博客文章。 http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/

编辑: 使用自定义管理器的更好方法可能是将其附加到除对象之外的其他属性,例如:

class MyModel(models.Model):
    # Blah blah
    active = CustomManager()

在您的观看中,您的查询看起来像MyModel.active.all()

EDIT2: 对于现代版本的django,更新了从get_query_setget_queryset的拼写方法。

答案 1 :(得分:3)

您可以编写自定义query manager,但我不相信这是正确的方法。这将为过滤器创建一个隐含的隐藏条件,这会使代码无法读取。记住Python的禅宗:Explicit is better than implicit。检测需要添加cancel = False的地方,然后添加,这就是你应该这样做的方式。