3

我有一个基本模型类,每次更改对象时都会创建对象的历史记录。该模型具有名为“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)

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

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

任何想法?

4

2 回答 2

0

你可以破解它,但让我警告你,这是一个非常糟糕的主意,并且会触及不应该被用户触及的内部结构。但如果你坚持,这会成功:

from django.db.models.sql.where import WhereNode
qs.query.where = WhereNode()
于 2013-09-24T13:02:41.120 回答
0

让我引用关于自定义管理器的 django 文档:

如果您使用自定义 Manager 对象,请注意 Django 遇到的第一个 Manager (按照它们在模型中定义的顺序)具有特殊状态。Django 将类中定义的第一个管理器解释为“默认”管理器,Django 的几个部分(包括转储数据)将专门为该模型使用该管理器。因此,最好谨慎选择默认管理器,以避免覆盖 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

于 2013-09-24T12:24:40.003 回答