Django QuerySet - 如何“禁用”以前过滤的值

时间:2013-09-24 11:56:59

标签: django model filter django-queryset

我有一个基础模型类,每次更改对象时都会创建对象的历史记录。该模型具有名为“is_history”的字段。我们的想法是,每次模型被某人更改时,都会使用旧数据创建模型的新实例。具有旧数据的新模型具有'is_history = True',因为它成为历史对象。 在默认的管理员更改列表中,我不希望看到历史记录对象。我不想默认在任何地方看到它们。这就是为什么我创建了新的管理器来覆盖默认的get_query_set()并添加'is_history = False'。

def get_query_set(self):
    qs = super(ModelHistoryManager, self).get_query_set()
    return qs.filter(is_history=False)

但我也应该能够很少使用管理过滤器在变更列表视图中显示历史对象。

我的问题是:我有一个已经过滤了此值的查询集。但是在admin的过滤器中,我从基本管理器获取过滤的查询集,我想将此过滤器从is_history = False更改为is_history = True,或者如果用户想要显示所有记录,则删除“is_history”的过滤器 - 两者都有历史记录和原始记录。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

让我引用关于Custom Managers的django文档:

  

如果您使用自定义管理器对象,请注意第一个管理器   Django遇到(按照模型中定义的顺序)   有特殊的地位。 Django解释了a中定义的第一个Manager   class作为“默认”管理器,以及Django的几个部分(包括   dumpdata)将专门为该模型使用该Manager。作为一个   结果,在选择默认值时要小心谨慎   经理为了避免重写get_query_set()的情况   导致无法检索您想要使用的对象。

所以,你应该这样做:

class MyModel(Model):
    objects = models.Manager() # The default manager.
    custom_manager = MyCustomManager() # This has overrided the get_query_set method

当然,如果您想要过滤的模型实例,则应使用custom_manager而不是objects

答案 1 :(得分:0)

你可以破解它,但是让我警告你,这是一个非常糟糕的主意,触及内部并不打算被用户触及。但如果你坚持,这就可以解决问题:

from django.db.models.sql.where import WhereNode
qs.query.where = WhereNode()