2012-03-05 29 views
3

使用django-tagging應用爲例,我想改變Tag模型的經理,這樣我可以有一個擴展的替換它:Django的 - 擴展了應用程序的模型,以覆蓋其經理

# 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)時呈現此錯誤:

不受約束的方法update_tags()必須與MyTagManager例如 作爲第一個參數來調用(得而不是LibraryFile實例)

LibraryFile模型是我試圖標記的模型,因此應該是第二個參數而不是第一個參數(首先是self)。

回答

0

使用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 
2

使用proxy model與不同經理:

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

很高興知道,看起來不錯,您要使用同一個數據庫表的基類擴展的模型。我的問題是'Tag'用於其他表單和字段等,我還必須擴展這些以將它們的用法更改爲'MyTag',因爲它們使用'update_tags()'?代替基類管理器的代碼會少很多,但我不確定這是否可行。 – Cruel 2012-03-05 18:41:30