在Django中,可以将Model.objects设置为模型定义之外的另一个管理器吗?

时间:2015-03-23 20:12:44

标签: python django

假设在Django 1.6中,您有以下型号代码:

class FooManager(models.Manager):
    def get_queryset():
        return ... # i.e. return a custom queryset

class Foo(models.Model):
    foo_manager = FooManager()

如果在Foo模型定义之外(例如在视图代码或shell中),则执行以下操作:

Foo.objects = FooManager()
Foo.objects.all()

由于名为Foo.objects.all()的变量为“无”,因此lookup_model上的Django内部代码会出现异常。

但是,如果您改为:

Foo.objects = Foo.foo_manager
Foo.objects.all()

Foo.objects.all()将按预期工作,即首先在模型定义中将objects定义为FooManager()

我认为这种行为是由于Django在模型定义过程中创建管理器时的“神奇”(正如它在创建模型字段时的魔力)。

我的问题:有没有理由不在模型定义之外以这种方式将objects分配给备用管理器?它似乎工作正常,但我不完全理解内部因此,所以要确保。

如果您想知道,上下文是我有一个很大的代码库,有许多典型的objects引用。我想让这个代码库动态地在不同的数据库上工作,即基于请求URL参数。我的计划是使用中间件将所有相关模型的objects设置为指向相应数据库的管理器。其余的应用程序代码将以愉快的方式继续使用objects,而无需知道任何更改。

1 个答案:

答案 0 :(得分:3)

麻烦的是,这根本不是线程安全的。执行此操作将更改该进程所服务的所有请求的定义,直到其他内容再次更改为止。这很可能会产生各种意想不到的效果。