Django расширяет пользовательский менеджер во время выполнения.Миксин стиль? - PullRequest
1 голос
/ 27 февраля 2012

Следующий код является частью класса TranslatedContent, который добавляет в модель собственный менеджер.

if hasattr(cls, 'objects'):
    if cls.objects.__class__ == models.Manager:
        # default manager, override
        cls.add_to_class('objects', TranslationManager()
    else:
        # there is a custom manager, don't override
        cls.add_to_class('translated', TranslationManager())

Когда пользовательский менеджер уже присутствует, он использует другое имя для менеджера.(в данном случае «переведено») Это не то, что я хочу.

Как я могу использовать то же имя («объекты») и все равно перезаписать его с помощью TranslationManager ()?Вместо перезаписи это будет переопределение / расширение.

1 Ответ

1 голос
/ 27 февраля 2012

Вы могли бы сделать что-то вроде:

if hasattr(cls, 'objects'):
    if cls.objects.__class__ == models.Manager:
        # default manager, override
        cls.add_to_class('objects', TranslationManager()
    else:
        # there is a custom manager, don't override
        class CombinedManager(cls.objects.__class__, TranslationManager):
            pass
        cls.add_to_class('objects', CombinedManager())

Но вы должны быть очень осторожны с пространством имен, в частности, конфликты, которые могут возникнуть между первоначальным менеджером и вашим TranslationManager.В общем, лучше предоставить конечному пользователю возможность определить, хотят ли они, чтобы их собственный менеджер также включал TranslationManager.

Я бы порекомендовал просто поместить его в документацию, которая TranslationManager будет добавлен в качестве менеджера по умолчанию, если пользовательский менеджер отсутствует.В противном случае пользователь должен иметь свой собственный менеджер, наследуемый от TranslationManager, чтобы получить эту функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...