修改Django中的默认查询集

32 投票
2 回答
14456 浏览
提问于 2025-04-15 20:42

我在我的模型里添加了一个“取消”字段,请问有没有办法把模型默认的查询改成类似于取消=False 这样的形式?这样我就不需要修改我所有的过滤或排除查询了。

2 个回答

3

你可以写一个自定义的查询管理器,但我觉得这不是最好的办法。这样做会让过滤条件变得隐晦和不明显,导致代码难以阅读。记住Python的哲学:显式优于隐式。找到需要添加取消状态为False的地方,直接加上这个条件,这才是正确的做法。

54

你可以通过自定义模型管理器来实现这个功能,并重写 get_queryset 函数,让它总是过滤掉那些已取消的对象,也就是 canceled=False。

class CustomManager(models.Manager):
    def get_queryset(self):
        return super().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/

编辑: 也许用自定义管理器的更好方法是把它附加到另一个属性上,而不是直接用 objects,比如:

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

这样在你的视图中,你的查询就可以写成 MyModel.active.all()

编辑2: 把方法名称从 get_query_set 更新为 get_queryset,以适应现代版本的 Django。

撰写回答