Python django动态自定义查询集
我有一个表来存储视图事件,也就是说,如果用户查看一个实体,一条记录将存储到该表中。此表由具有泛型关系的模型表示,也就是说,它可以与任何其他模型相关 我已经定义了一个mixinPython django动态自定义查询集,python,django,Python,Django,我有一个表来存储视图事件,也就是说,如果用户查看一个实体,一条记录将存储到该表中。此表由具有泛型关系的模型表示,也就是说,它可以与任何其他模型相关 我已经定义了一个mixinViewTracked,它应该由任何可以跟踪的模型扩展(即classsomemodel(ViewTracked)) 例如,我想为对象的queryset创建一个名为custom\u method的自定义方法。我知道我可以定义一个自定义管理器并用它轻松覆盖对象管理器,但问题是跟踪模型可能已经有一个自定义管理器,它有自己的自定义查
ViewTracked
,它应该由任何可以跟踪的模型扩展(即classsomemodel(ViewTracked)
)
例如,我想为对象的queryset创建一个名为custom\u method
的自定义方法。我知道我可以定义一个自定义管理器
并用它轻松覆盖对象
管理器,但问题是跟踪模型可能已经有一个自定义管理器,它有自己的自定义查询集,所以我不能简单地覆盖它并丢失它所拥有的自定义查询集
不幸的是,我找不到合适的方法来实现这一点,所以我尝试添加一个元类来覆盖管理器的get\u queryset
,并向其中添加我的自定义方法,但由于某些原因,当我调用SomeModel.objects
时,它总是返回None
以下是我尝试过的:
#元类
类ViewTrackedMeta(模型库):
定义新(mcs、类名称、基本类、属性目录):
#让ModelBase发挥它的魔力
new_class=super()。uuu new_uuuuuuuuuuuuuuu(mcs、类名称、基类、属性)
如果hasattr(新类“对象”):
对象\u管理器=新建\u类.objects
如果isinstance(对象管理器、管理器):
queryset=objects\u manager.get\u queryset()
def自定义_方法(查询集):
返回queryset.filter(…)
def get_extended_queryset(管理器):
queryset.custom\u method=types.MethodType(custom\u method,queryset)
objects\u manager.get\u queryset=types.MethodType(get\u extended\u queryset,objects\u manager)
返回新的\u类
#混合
类ViewTracked(模型,元类=ViewTrackedMeta):
类元:
抽象=真
...
#模型
类SomeModel(视图跟踪):
对象=CustomManager()
类SomeOtherModel(视图跟踪):
... # 默认django对象管理器
类SomeOtherModel(视图跟踪):
objects=OtherCustomManager()
有没有其他方法可以实现我想要的?为什么SomeModel.objects
总是返回None
?除了实例化manager类之外,您应该使用\u queryset
中的。这是你的电话号码
现在您可以执行以下操作:
MyModel.objects.manager_and_queryset_method()
以及
MyModel.objects.filter(something="else").manager_and_queryset_method()
您是否尝试过实例化manager类objects=CustomManager()
很抱歉,这是一个问题的输入错误,在我的真实代码中,我已经在实例化它们了。我编辑了代码。谢谢你的贡献。虽然我知道如何从queryset创建自定义管理器,但这里的问题是我无法覆盖模型的管理器,因为它可能已经是具有自定义queryset的自定义管理器。我只想向模型管理器的get\u queryset
返回的queryset添加一个自定义方法。
MyModel.objects.filter(something="else").manager_and_queryset_method()