如何动态添加自定义管理器到django中的模型

时间:2015-09-17 08:28:13

标签: python django django-models django-managers

在这个django项目中,有很多模型,我们希望使用queryset.as_manager为每个模型添加一个自定义查询集和一个管理器,而不必手动在每个模型中指定它。

所有查询集/管理器都以各个django应用程序的manager.py文件夹中的每个模型的并行结构进行组织。

由于管理员是类级属性,在 init 中添加它们不起作用,django会做一些非常精美的元编程,所以正确的方法是什么? Django 1.7和1.8都可以接受。感谢

(我认为pythonic方式显然比隐式更好,但它似乎是一个很多的crud代码,所以有一种Meta方式来做到这一点。)

2 个答案:

答案 0 :(得分:1)

你可以编写一个工厂函数来创建像这样的proxy models

def model_with_queryset(model_class, queryset_class):
    class Proxy(model_class):
        objects = queryset_class.as_manager()
        class Meta:
            proxy = True
            app_label = model_class._meta.app_label
    return Proxy

此处model_class将是您要更改查询集的任何模型。

然后,您可以动态创建模型类:

SomeModelWithSomeQS = model_with_queryset(SomeModel, SomeQS)

并将它们用作任何其他(代理)模型。

答案 1 :(得分:0)

django-way将使用db.signals.class_prepared信号并从django.db.managers.ensure_default_manager()中汲取灵感,以便将经理正确地添加到课程中(主要使用model.add_to_class()来确保经理人contribute_to_class() 1}}方法被正确调用)。然后,您必须编写一些实用程序函数来检索给定模型类的相应查询集。

或者您可以编写自己的自定义元类(基于django.db.models.base.ModelBase)和模型类(使用自定义元类),并使所有模型类继承自它。

话虽这么说,你真的需要一个很多的模型才能将这些解决方案中的任何一个视为经济有效......