覆盖Django的RelatedManager方法

时间:2011-01-14 18:53:12

标签: 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()?

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:3)

我不确定你需要覆盖什么 - 默认的查询集已经做了你想要的。

但是要回答这个问题,您可以在模型上定义自定义管理器并设置use_for_related_fields=True以确保它被用作自动管理器。请参阅controlling automatic Manager types上的文档。

答案 1 :(得分:0)

我想我遇到了同样的问题。

我有一个自定义管理器,它会覆盖self._dbget_query_set()以将其路由到不同的数据库。

我动态创建了一个模型类,并使用我的自定义管理器设置了_default_manager

这适用于类本身,但不适用于相关字段(foreign或many2many),即使我设置了集use_for_related_fields = True

对于相关字段,附加db_manager(dbname)(例如record.managed_set.db_manager(dbname))可以修复 all()方法,但不能修复 add()方法

要了解我的意思,请参阅此django票证:http://code.djangoproject.com/ticket/13358

我认为它适用于all(),但不适用于add()

答案 2 :(得分:0)

RelatedManager.add()调用RelatedManager._add_items(),后者调用Manager.bulk_create()

因此,如果扩展Manager.bulk_create(),则可能会实现所追求的目标。