2012-02-23 10 views
10

Quiero hacer una initalización adicional cada vez que se creen instancias de un modelo de django específico. Sé que overriding __init__ can lead to trouble. ¿Qué otras alternativas debería considerar?Agregando al "constructor" de un modelo de django

Actualización. Detalles adicionales: La intención es inicializar una máquina de estado que representan las instancias de ese modelo. Esta máquina de estados es provista por una biblioteca importada, y mi modelo django persiste en su estado interno. La idea es que cada vez que se cargue el modelo, la máquina de estado se inicialice automáticamente con los datos del modelo.

+0

Has malinterpretado esa pregunta. No es que invalidar '__init__' no funcione, el OP simplemente lo hizo todo mal. Eres libre de anular '__init__', pero la eficacia de eso depende completamente de lo que estás tratando de hacer exactamente. Entonces, ¿por qué no nos dices eso, para que podamos ayudarte? –

+0

Gracias, he vuelto a leer el otro hilo. ¿Quiere decir que si conservo la firma '' '(self, * args, ** kwargs)' '', anular \ _ \ _ init \ _ \ _ no prevalecerá sobre django? –

+0

He agregado más información a la pregunta para aclarar la intención. –

Respuesta

14

Reemplazar __init__ podría funcionar, pero es una mala idea y no es la manera de Django.

La forma correcta de hacerlo en Django es usando signals.

Las que le interesan en este caso son pre_init y post_init.

django.db.models.signals.pre_init

Cada vez que se instancia un modelo Django , esta señal se envía al comienzo del método del modelo __init__() .

django.db.models.signals.post_init

Como pre_init, pero éste se envía cuando el __init__(): método termina

Así que el código debe ser algo así como

from django.db import models 
from django.db.models.signals import post_init 

class MyModel(models.Model): 
    # normal model definition... 

def extraInitForMyModel(**kwargs): 
    instance = kwargs.get('instance') 
    do_whatever_you_need_with(instance) 

post_init.connect(extraInitForMyModel, MyModel) 

Puede también conectar señales a los modelos predefinidos de Django.

+0

¿De qué manera es una mala idea anular '__init__'? No presenta más problemas en django que en cualquier otra situación. – Marcin

+7

vartec Sé que ha pasado un tiempo, pero me topé con tu respuesta y tengo curiosidad. ¿Por qué dices que las señales son la forma de Django? ¿Por qué no una de las dos formas descritas en la documentación de Django para resolver esta situación precisa? https://docs.djangoproject.com/en/1.4/ref/models/instances/#django.db.models.Model Gracias – oneloop

+2

El enlace actualizado del comentario anterior es este: https: //docs.djangoproject. com/en/1.9/ref/models/instances / –

Cuestiones relacionadas