Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django动态自定义查询集_Python_Django - Fatal编程技术网

Python django动态自定义查询集

Python django动态自定义查询集,python,django,Python,Django,我有一个表来存储视图事件,也就是说,如果用户查看一个实体,一条记录将存储到该表中。此表由具有泛型关系的模型表示,也就是说,它可以与任何其他模型相关 我已经定义了一个mixinViewTracked,它应该由任何可以跟踪的模型扩展(即classsomemodel(ViewTracked)) 例如,我想为对象的queryset创建一个名为custom\u method的自定义方法。我知道我可以定义一个自定义管理器并用它轻松覆盖对象管理器,但问题是跟踪模型可能已经有一个自定义管理器,它有自己的自定义查

我有一个表来存储视图事件,也就是说,如果用户查看一个实体,一条记录将存储到该表中。此表由具有泛型关系的模型表示,也就是说,它可以与任何其他模型相关

我已经定义了一个mixin
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()