2012-02-23 9 views
10

Chcę wykonać dodatkową initalizację, gdy tworzone są instancje określonego modelu django. Wiem, że overriding __init__ can lead to trouble. Jakie inne alternatywy powinienem wziąć pod uwagę?Dodawanie do "konstruktora" modelu django

Aktualizacja. Dodatkowe szczegóły: Celem jest zainicjowanie maszyny stanu, którą reprezentują wystąpienia tego modelu. Ta maszyna-stan jest dostarczana przez importowaną bibliotekę, a jej stan wewnętrzny jest utrzymywany przez mój model django. Chodzi o to, że za każdym razem, gdy model zostanie załadowany, automat stanowy zostanie automatycznie zainicjalizowany danymi modelu.

+0

Źle zinterpretowałeś to pytanie. Nie oznacza to, że nadpisywanie '__init__' nie działa, OP tylko wszystko zepsuł. Możesz zastąpić '__init__', ale jego skuteczność jest całkowicie zależna od tego, co dokładnie próbujesz zrobić. Dlaczego nam tego nie powiesz, więc możemy ci naprawdę pomóc. –

+0

Dzięki, ponownie przeczytałem drugi wątek. Masz na myśli, jeśli zachowam sygnaturę '' '(self, * args, ** kwargs)' '', nadpisywanie \ _ \ _ init \ _ \ _ nie będzie działało na django? –

+0

Dodałem więcej informacji do pytania, aby wyjaśnić zamiar. –

Odpowiedz

14

Przesłanianie __init__ może działać, ale to zły pomysł i nie jest to sposób Django.

Odpowiednim sposobem zrobienia tego w Django jest użycie signals.

Te, które Cię interesują w tym przypadku to pre_init i post_init.

django.db.models.signals.pre_init

Kiedykolwiek instancji Django modelu, to sygnał jest wysyłany na początku __init__() metody modelu.

django.db.models.signals.post_init

Jak pre_init, ale ten jest wysyłany gdy __init__(): metoda zakończy

więc kod powinien być coś

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) 

jak również można podłączyć sygnały do predefiniowanych modeli Django.

+0

W jaki sposób zastąpienie '__init__' jest złym pomysłem? Nie przedstawia więcej problemów w django niż w jakiejkolwiek innej sytuacji. – Marcin

+7

vartec Wiem, że minęło trochę czasu, ale po prostu wpadłem na twoją odpowiedź i jestem ciekawy. Dlaczego mówisz, że sygnały są sposobem Django? Dlaczego nie skorzystać z jednego z dwóch sposobów opisanych w dokumentacji Django, aby rozwiązać tę dokładną sytuację? https://docs.djangoproject.com/en/1.4/ref/models/instances/#django.db.models.Model Dzięki – oneloop

+2

Zaktualizowany link z poprzedniego komentarza brzmi: https: //docs.djangoproject. com/en/1.9/ref/models/instances / –

Powiązane problemy