Først, i stedet for at tilsidesætte gem for at tilføje __before
og __after
metoder, kan du bruge den indbyggede pre_save
, post_save,
pre_delete,
og post_delete
signaler. https://docs.djangoproject.com/da/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
og post_delete
vil blive udløst, når du kalder delete()
på et forespørgselssæt.
Til masseopdatering skal du dog manuelt kalde den funktion, du selv vil udløse. Og du kan også smide det hele i en transaktion.
For at kalde den korrekte triggerfunktion, hvis du bruger dynamiske modeller, kan du inspicere modellens ContentType. For eksempel:
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)