Переопределение методов Django RelatedManager - PullRequest
8 голосов
/ 14 января 2011

Функция Django ForeignRelatedObjectsDescriptor.create_manager(...) динамически создает классы RelatedManager и впоследствии инициализирует экземпляр динамически создаваемого класса.

Если бы я хотел переопределить метод RelatedManager.add(...), как бы я это сделал?

Классы RelatedManager создаются в файле: django/db/models/fields/related.py.

Примером того, как я хотел бы использовать пользовательский RelatedManager, является ...

class Record(Model):
    string = CharField()
class Managed(Model):
    record = ForeignKey('Record')
    boolean = BooleanField()
def view_function(...):
    record = Record(string='Example')
    record.save()
    record.managed_set.add(Managed(boolean=True)) # How to override add()?

Любые предложения будут оценены.

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Я не уверен, для чего вам нужно переопределение - набор запросов по умолчанию уже делает то, что вы хотите.

Но чтобы ответить на вопрос, вы можете определить собственный менеджер для модели и установить use_for_related_fields=Trueчтобы убедиться, что он используется в качестве автоматического менеджера.См. Документацию по управлению автоматическими типами диспетчера .

0 голосов
/ 20 февраля 2011

Я думаю, у меня та же проблема.

У меня есть собственный менеджер, который переопределяет self._db и get_query_set() для маршрутизации его в разные базы данных.

Я динамически создал класс модель , и его _default_manager установлен с помощью моего собственного менеджера.

Это работает для самого класса, но не для связанного поля (foreign или many2many), хотя я установил наборы use_for_related_fields = True.

Для связанного поля добавление db_manager(dbname) (например, record.managed_set.db_manager(dbname)) может исправить метод all () , но не для метода add () .

Чтобы понять, что я имею в виду, посмотрите этот билет на django: http://code.djangoproject.com/ticket/13358

Я думаю, что это работает для all(), но не add().

...