2010-10-13 18 views
11

utilizando, por ejemploPython/Django: ¿Agregar métodos de modelo personalizados?

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

Cuando trato de llamar a este método durante pre_save, guardar, etc post_save, Python lanza una TypeError; método sin consolidar

¿Cómo se pueden agregar métodos de modelo personalizados que se pueden ejecutar de la misma manera como model.objects.get(), etc.?

Editar: intentado usar super(model, self).my_custom_method(*args, **kwargs) pero en ese caso Python dice que el modelo no tiene atributo my_custom_method

Respuesta

25

¿Cómo se llama a este método? Ha definido un método instancia, que solo se puede invocar en una instancia de la clase, no en la propia clase. En otras palabras, una vez que tenga una instancia de model llamada mymodelinstance, puede hacer mymodelinstance.my_custom_method().

Si desea llamarlo a la clase , debe definir un método de clase. Puede hacer esto con el decorador @classmethod en su método. Tenga en cuenta que, por convención, el primer parámetro para un método de clase es cls, no self. Consulte the Python documentation para obtener detalles sobre classmethod.

Sin embargo, si lo que realmente desea hacer es agregar un método que realiza una operación de nivel de consulta, como objects.filter() o objects.get(), entonces la mejor opción es definir un Administrador personalizado y agregar su método allí. Entonces podrás hacer model.objects.my_custom_method(). Nuevamente, vea el Django documentation en Managers.

0

Si está implementando una señal para su modelo, no necesariamente tiene que definirse solo en la clase de modelo. Puede definirlo fuera de la clase y pasar el nombre de la clase como parámetro a la función de conexión.

Sin embargo, en su caso necesita el objeto modelo para acceder al método.

Cuestiones relacionadas