2012-02-23 18 views
10

Belirli bir django modelinin örnekleri oluşturulduğunda ek bir inakasyon yapmak istiyorum. Bunu overriding __init__ can lead to trouble biliyorum. Başka hangi alternatifleri düşünmeliyim?Bir django modelinin "yapıcısı" na eklenme

Güncelleştirme. Ek ayrıntılar: Amaç, o modelin örneklerinin temsil ettiği bir durum makinesini başlatmaktır. Bu devlet-makine ithal bir kütüphane tarafından sağlanmakta ve django-modelim tarafından içsel hal sürmektedir. Fikir, model yüklendiğinde, durum makinesinin otomatik olarak modelin verileriyle başlatılacağıdır.

+0

Bu soruyu yanlış yorumlamışsınız. Bu '__init__' geçersiz kılan değil, OP sadece yanlış yaptı. __init__'yi geçersiz kılmak için özgürsünüz, fakat bunun etkinliği tam olarak ne yapmaya çalıştığınıza bağlıdır. Öyleyse neden bize bunu söylemiyorsunuz, bu yüzden size gerçekten yardımcı olabiliriz. –

+0

Teşekkürler, diğer parçayı okudum. Yani, eğer imzayı '' '(ben, args, ** kwargs)' '' tutabiliyorsam, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\ –

+0

Niyeti açıklığa kavuşturmak için soruya biraz daha bilgi ekledim. –

cevap

14

__init__ geçersiz kılınabilir, ancak bu kötü bir fikirdir ve Django yolu değildir.

Django'da bunu yapmanın doğru yolu signals kullanıyor.

Bu durumda ilginizi çekecek olanlar pre_init ve post_init'dur. Bir Django modeli örneğini zaman

django.db.models.signals.pre_init

, bu sinyal modelin __init__() yöntemin başında gönderilir.

django.db.models.signals.post_init

pre_init gibi

ancak __init__() zaman bu bir gönderilir: yöntem

Yani kod Siz de sinyallerini bağlayabilirsiniz

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) 

gibi bir şey olmalı bitirir Django'nun önceden tanımlanmış modellerine.

+0

'__init__' işlevini geçersiz kılmak nasıl bir fikir? Django'da başka herhangi bir durumdan daha fazla sorun ortaya çıkarmaz. – Marcin

+7

vartec Biliyorum biraz zaman geçti, ama cevabını çarptım ve merak ediyorum. Neden sinyallerin Django tarzı olduğunu söylüyorsun? Neden bu hassas durumu çözmek için Django belgelerinde açıklanan iki yoldan biri olmasın? https://docs.djangoproject.com/en/1.4/ref/models/instances/#django.db.models.Model Teşekkürler – oneloop

+2

Önceki yorumun güncellenmiş linki şudur: https: //docs.djangoproject. com/tr/1.9/ref/modeller/örnekleri / –