以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
是第一个)。
答案 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