Po pierwsze, zamiast zastępować zapisywanie, aby dodać __before
i __after
metod, możesz użyć wbudowanego pre_save
, post_save,
pre_delete,
i post_delete
sygnały. https://docs.djangoproject.com/en/1.4/topics/signals/
from django.db.models.signals import post_save
class YourModel(models.Model):
pass
def after_save_your_model(sender, instance, **kwargs):
pass
# register the signal
post_save.connect(after_save_your_model, sender=YourModel, dispatch_uid=__file__)
pre_delete
i post_delete
zostanie wyzwolony, gdy wywołasz delete()
na queryset.
W przypadku aktualizacji zbiorczej musisz jednak ręcznie wywołać funkcję, którą chcesz wyzwolić samodzielnie. Możesz to wszystko wrzucić również do transakcji.
Aby wywołać odpowiednią funkcję wyzwalacza, jeśli używasz modeli dynamicznych, możesz sprawdzić ContentType modelu. Na przykład:
from django.contrib.contenttypes.models import ContentType
def view(request, app, model_name, method):
...
model = get_model(app, model_name)
content_type = ContentType.objects.get_for_model(model)
if content_type == ContenType.objects.get_for_model(YourModel):
after_save_your_model(model)
elif content_type == Contentype.objects.get_for_model(AnotherModel):
another_trigger_function(model)