Python 修改django中的默认queryset

Python 修改django中的默认queryset,python,django,django-models,metaprogramming,Python,Django,Django Models,Metaprogramming,我已经在模型中添加了一个“cancelled”字段,是否有办法将模型默认查询修改为cancelled=False?无需修改所有筛选/排除查询?您可以使用自定义模型管理器执行此操作,并覆盖get\u queryset函数以始终筛选取消=False class CustomManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(canceled=False)

我已经在模型中添加了一个“cancelled”字段,是否有办法将模型默认查询修改为cancelled=False?无需修改所有筛选/排除查询?

您可以使用自定义模型管理器执行此操作,并覆盖
get\u queryset
函数以始终筛选取消=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()
时,它将始终排除已取消的对象。这是一篇我发现对这个主题很有帮助的博客文章

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

class MyModel(models.Model):
    # Blah blah
    active = CustomManager()
在您的视图中,您的查询看起来像
MyModel.active.all()

编辑2:
对于django的现代版本,已将拼写方法从
get\u query\u set
更新为
get\u queryset

您可以编写自定义,但我认为这不是正确的方法。这将为过滤器创建一个隐式的隐藏条件,这将使代码无法读取。记住Python的禅宗:
显式优于隐式。检测需要添加cancelled=False的位置,然后只添加此位置,这是您应该做的。

您必须非常小心地覆盖默认管理器,就像这样。在这种特殊情况下,一旦项目被取消,您将无法使用filter()/get()找到它。同意。我通常会用覆盖get()来补充这种方法,以便在给定pk时不使用此过滤器。您可能还希望更改管理查询集,以返回包括已取消的所有内容。但是,如果您很少希望在查询中取消项目,这是一种合理的方法。您好,有没有办法修改get_query_set的行为以使用其他参数(即从某处传递的参数)或使用全局变量(如当前登录用户信息)?谢谢想知道
get\u query\u set
拼写从何而来。我相信正确的方法名称是。是的,旧名称
get\u query\u set
在1.6中被弃用,在1.8中被删除:我强烈反对。那么,拥有定制经理有什么意义呢?使用MyModel.not\u cancelled.all()的
not\u cancelled=CustomManager()
隐含了什么?