Django - Расширение модели приложения для переопределения его менеджера - PullRequest
3 голосов
/ 05 марта 2012

Используя приложение 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) со страницы администратора:

необязательный метод update_tags () должен вызываться с экземпляром MyTagManager в качестве первого аргумента (вместо этого получил экземпляр LibraryFile)

Модель LibraryFile - это та, которую я пытаюсь пометить, и поэтому она должна быть вторым аргументом вместо первого (self - первый).

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

Используйте модель прокси с другим менеджером:

class MyTag(Tag):
    objects = MyTagManager()
    class Meta:
        proxy = True
1 голос
/ 09 марта 2012

Используя предложение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...