Python / Django: добавление пользовательских методов модели? - PullRequest
12 голосов
/ 13 октября 2010

Используя, например,

class model(models.Model)
    ....
    def my_custom_method(self, *args, **kwargs):
        #do something

Когда я пытаюсь вызвать этот метод во время pre_save, save, post_save и т. Д., Python вызывает TypeError;Несвязанный метод.

Как можно добавить пользовательские методы модели, которые могут быть выполнены таким же образом, как model.objects.get () и т. д.

Редактировать: пробовал использовать super(model, self).my_custom_method(*args, **kwargs), но вв этом случае Python говорит, что модель не имеет атрибута my_custom_method

Ответы [ 2 ]

29 голосов
/ 13 октября 2010

Как вы называете этот метод?Вы определили метод instance , который можно вызывать только для экземпляра класса, но не для самого класса.Другими словами, если у вас есть экземпляр model с именем mymodelinstance, вы можете сделать mymodelinstance.my_custom_method().

Если вы хотите вызвать его на классе , вам нужноопределить метод класса.Вы можете сделать это с помощью декоратора @classmethod в вашем методе.Обратите внимание, что по соглашению первый параметр метода класса - cls, а не self.См. в документации Python для получения подробной информации о методе class.

Однако, если вы действительно хотите добавить метод, выполняющий операцию на уровне набора запросов, например objects.filter() или objects.get(), тогда вам лучше всего выбрать собственного менеджера и добавить туда свой метод.Тогда вы сможете сделать model.objects.my_custom_method().Снова, смотрите документацию Django в разделе Менеджеры.

0 голосов
/ 13 октября 2010

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

Однако в вашем случае вам нужен объект модели для доступа к методу.

...