gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:13:38 25 4
gpt4 key购买 nike

假设,在 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 模型定义之外(例如在 View 代码或 shell 中),您执行以下操作:

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

由于名为 lookup_model 的变量为“None”,您将在 Foo.objects.all() 的 Django 内部代码中遇到异常。

但是,如果您这样做:

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

Foo.objects.all() 将按预期工作,即,就好像 objects 已被定义为 FooManager()首先是模型定义。

我相信这种行为是由于 Django 在模型定义期间创建管理器时发挥了“魔力”(就像它在创建模型字段时发挥了魔力一样)。

我的问题:是否有任何理由不在模型定义之外以这种方式将对象分配给备用管理器?它似乎工作正常,但我不完全了解内部原理,所以想确定一下。

如果您想知道,上下文是我有一个大型代码库,其中包含许多对对象的典型引用。我想让这个代码库动态地在不同的数据库上工作,即基于请求 URL 参数。我的计划是使用中间件将所有相关模型的对象设置为指向适当数据库的管理器。然后,应用程序代码的其余部分将继续使用对象,而无需知道任何内容发生了变化。

最佳答案

问题是这根本不是线程安全的。这样做将更改该进程所服务的所有请求的定义,直到其他东西再次更改它。这很可能会产生各种意想不到的影响。

关于python - 在 Django 中,可以将 Model.objects 设置为模型定义之外的另一个管理器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29219462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com