2015-02-18 2 views
0

я модель Django сказать:Как добавить новый метод в класс Django из других модулей?

class MyOperation(models.Model): 
    name = models.CharField(max_length=100) 

    def my_method(self): 
     pass 

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

Я пытался сделать это с другой модуль приложения под названием custom.py:

from operations.models import MyOperation 

def op_custom(test): 
    print "testing custom methods" 

MyOperation.op_custom = op_custom 

Однако это не похоже на работу, во время выполнения метода не существует.

Это способ изменить определение класса из другого приложения django? Есть ли лучший способ сделать это?

Благодаря

+0

1. Не делайте этого. 2. Никогда не делайте этого. 3. Это нарушает самоанализ и беспорядок с человеческим разбором кода python, поэтому его не следует делать. 4. Не делайте этого. 5. Если вам абсолютно необходимо это сделать, вы можете, как показано ссылкой @ knbk. – astex

+0

Это не тот же вопрос, я спрашиваю, как добавить метод в Django Model, я имею в виду класс, а не объект. –

+0

@JoseLuisdelaRosa Это именно то, на что ссылается ссылка, если я не понимаю, что вы на самом деле спрашиваете. Один вопрос: действительно ли вы используете код в 'custom.py'? – knbk

ответ

3

The Right Way ™, чтобы сделать это через Mixin:

class MyMixIn(object): 
    def op_custom(self): 
     print("foo") 

class MyOperation(models.Model, MyMixIn): 
    def op_normal(self): 
     print("bar") 

Это имеет несколько преимуществ по сравнению с обезьяной-заплат в другом методе:

  • Mixin находится в класс 'method resolution order, поэтому самоанализ работает отлично.
  • Гарантируется, что он будет определен для каждого экземпляра класса независимо от того, где он создается, поскольку сам класс наследуется от mixin. В противном случае вы можете получить экземпляры до того, как будет применен патч обезьяны, где этого метода нет.
  • Это дает очевидное место для добавления таких методов в будущем.
+0

Не следует ли отменять наследование модели, например MyMixIn должен появиться до того, как он моделирует. Моделя? 'class MyOperation (MyMixIn, models.Model)' – Tim

+0

@TimSchneider Это зависит от предполагаемого использования. Если mixin должен переопределять методы класса 'Model', тогда да.Однако в некоторых случаях потребуется обратное. Например, mixin можно использовать для «подталкивания» класса модели путем написания пользовательских методов 'save()' ... ..., предоставляя дополнительную функциональность, которая может быть использована с реальной моделью путем наследования вышеописанным способом. – astex

+0

Это не отвечает на вопрос и не служит той же цели. Добавление Mixin в '__bases__' исходного экземпляра может улучшить ответ. – DylanYoung

Смежные вопросы