假设在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
,而无需知道任何更改。
答案 0 :(得分:3)
麻烦的是,这根本不是线程安全的。执行此操作将更改该进程所服务的所有请求的定义,直到其他内容再次更改为止。这很可能会产生各种意想不到的效果。