Python/Django: добавление настраиваемых методов модели?

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

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

Ответ 1

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

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

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

Ответ 2

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

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