gpt4 book ai didi

python - Django 在运行时扩展自定义管理器。混音风格?

转载 作者:太空宇宙 更新时间:2023-11-03 19:21:47 28 4
gpt4 key购买 nike

以下代码是 TranslatedContent 类的一部分,它将自定义管理器添加到模型中。

if hasattr(cls, 'objects'):
if cls.objects.__class__ == models.Manager:
# default manager, override
cls.add_to_class('objects', TranslationManager()
else:
# there is a custom manager, don't override
cls.add_to_class('translated', TranslationManager())

当自定义管理器已存在时,它会使用不同的管理器名称。 (在本例中为“翻译”)这不是我想要的。

如何使用相同的名称(“对象”)并仍然用 TranslationManager() 覆盖它?而不是覆盖,这将是覆盖/扩展。

最佳答案

可以执行以下操作:

if hasattr(cls, 'objects'):
if cls.objects.__class__ == models.Manager:
# default manager, override
cls.add_to_class('objects', TranslationManager()
else:
# there is a custom manager, don't override
class CombinedManager(cls.objects.__class__, TranslationManager):
pass
cls.add_to_class('objects', CombinedManager())

但是,您需要对命名空间非常谨慎,特别是原始管理器和您的 TranslationManager 之间可能发生的冲突。一般来说,最好让最终用户决定他们是否希望自定义管理器也包含 TranslationManager

我建议简单地将其放入文档中,如果不存在自定义管理器,则仅将 TranslationManager 添加为默认管理器。否则,用户应该让其自定义管理器继承自 TranslationManager 以获得该功能。

关于python - Django 在运行时扩展自定义管理器。混音风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9469575/

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