Django扩展应用程序的模型以覆盖其管理

2024-03-29 02:33:02 发布

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

django-tagging应用程序为例,我想更改Tag模型的管理器,以便用扩展的管理器替换它:

# mytagging/models.py
from django.db import models
from tagging.models import TagManager, Tag

class MyTagManager(TagManager):
    def update_tags(self, obj, tag_names):
        # My actions
        return super(MyTagManager, self).update_tags(obj, tag_names)
    def add_tag(self, obj, tag_name):
        # My actions
        return super(MyTagManager, self).add_tag(obj, tag_name)

Tag.objects = MyTagManager

现在,Tag.objects = MyTagManager不起作用,我也不希望它起作用,但它说明了我想要实现的目标。我可以很好地创建class MyTag(Tag)并以这种方式设置管理器,但这样看来,我还必须扩展其他所有使用Tag的类并将其更改为MyTag。在

我试图Tag.objects = MyTagManager()初始化该类,但是我从一个查询对象中得到了一个错误'NoneType' object has no attribute '_meta'。在

从管理页调用Tag.objects.update_tags(kwargs['instance'], tags)时,上面的代码呈现此错误:

unbound method update_tags() must be called with MyTagManager instance as first argument (got LibraryFile instance instead)

LibraryFile模型是我试图标记的模型,因此应该是第二个参数而不是第一个参数(self是第一个)。在


Tags: djangoinstancefrom模型selfobj管理器objects
2条回答

proxy model与其他管理器一起使用:

class MyTag(Tag):
    objects = MyTagManager()
    class Meta:
        proxy = True

使用Sector的建议作为解决方案的一部分,我最终只在需要的地方修补Tag模型,而不是{}。在

这是最终代码:

from tagging.models import TagManager, Tag
import tagging

class MyTagManager(TagManager):
    def update_tags(self, obj, tag_names):
        # My actions
        return super(MyTagManager, self).update_tags(obj, tag_names)
    def add_tag(self, obj, tag_name):
        # My actions
        return super(MyTagManager, self).add_tag(obj, tag_name)

class MyTag(Tag):
    objects = MyTagManager()
    class Meta:
        proxy = True

tagging.models.Tag = MyTag
tagging.fields.Tag = MyTag

相关问题 更多 >