覆盖Django的RelatedManager方法

bri*_*dum 8 python django django-models

Django的ForeignRelatedObjectsDescriptor.create_manager(...)函数动态创建RelatedManager类,然后初始化动态创建的类的实例.

如果我想覆盖该RelatedManager.add(...)方法,我该怎么做?

这些RelatedManager类是在文件中创建的:django/db/models/fields/related.py.

我想如何使用自定义的示例RelatedManager是......

class Record(Model):
    string = CharField()
class Managed(Model):
    record = ForeignKey('Record')
    boolean = BooleanField()
def view_function(...):
    record = Record(string='Example')
    record.save()
    record.managed_set.add(Managed(boolean=True)) # How to override add()?
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激.

Dan*_*man 4

我不确定您需要覆盖什么 - 默认查询集已经满足您的要求。

但要回答这个问题,您可以在模型上定义一个自定义管理器并进行设置use_for_related_fields=True以确保它将其用作自动管理器。请参阅有关控制自动管理器类型的文档。

  • 这是行不通的。创建设置 use_for_lated_fields = True 的自定义管理器可确保相关管理器的超类是自定义管理器。但是,RelatedManager 类是在我的问题中指定的文件中动态定义的,并且自定义管理器中的任何 add() 都会被RelatedManager 的动态定义覆盖。我可以修改RelatedManager的add()并添加要在自定义管理器中实现的self.pre_save()和self.post_save()挂钩,然后向Django提交补丁,但我想知道是否有更好的方法意识到。 (7认同)
  • -1,因为它不起作用,该变量中的“_lated_”只是一段历史,与相关领域的管理者无关。 (2认同)