PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Django émule le comportement du déclencheur de base de données lors de l'insertion/mise à jour/suppression en bloc

Tout d'abord, au lieu de remplacer save pour ajouter __before et __after méthodes, vous pouvez utiliser les méthodes intégrées pre_save , post_save, pre_delete, et post_delete signaux. 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 et post_delete se déclenchera lorsque vous appelez delete() sur un ensemble de requêtes.

Pour la mise à jour en bloc, vous devrez toutefois appeler manuellement la fonction que vous souhaitez déclencher vous-même. Et vous pouvez également tout mettre dans une transaction.

Pour appeler la fonction de déclenchement appropriée si vous utilisez des modèles dynamiques, vous pouvez inspecter le ContentType du modèle. Par exemple :

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)