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

时间:2012-03-05 07:16:38

标签: python django

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。< / p>

我尝试Tag.objects = MyTagManager()来初始化类,但是我从查询对象中得到了错误'NoneType' object has no attribute '_meta',它出现了。

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

  

必须使用MyTagManager实例调用未绑定方法update_tags()   作为第一个参数(改为获得LibraryFile实例)

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

2 个答案:

答案 0 :(得分:2)

proxy model与不同的经理一起使用:

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

答案 1 :(得分:1)

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

这是最终的代码:

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