重写Django的RelatedManager方法

2024-09-24 22:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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()?

如有任何建议,我们将不胜感激。在


Tags: django函数addstringmodelcreatemanagerrecord
2条回答

我想我也有同样的问题。在

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

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

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

对于相关字段,追加db_manager(dbname)(例如,record.managed_set.db_manager(dbname))可以修复all()方法,但对于add()方法则不行。在

要理解我的意思,请看这张django票:http://code.djangoproject.com/ticket/13358

我认为它适用于all(),但不适用于{}。在

我不确定您需要重写的原因-默认的queryset已经完成了您想要的。在

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

相关问题 更多 >