修改django中的默认查询集

jua*_*ren 24 python django metaprogramming django-models

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

Mar*_*vin 37

您可以使用自定义模型管理器执行此操作,并覆盖该get_queryset函数以始终过滤cancelled = 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()
Run Code Online (Sandbox Code Playgroud)

然后在调用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()
Run Code Online (Sandbox Code Playgroud)

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

EDIT2:更新方法从拼写get_query_setget_querysetDjango的现代版本.

  • 你必须非常小心覆盖默认管理器就像那样.在这种特殊情况下,一旦取消项目,您将无法使用filter()/ get()找到它. (5认同)