PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Django emuliert das Datenbank-Triggerverhalten beim Masseneinfügen/-aktualisieren/-löschen

Erstens, anstatt save zu überschreiben, um __before hinzuzufügen und __after Methoden können Sie das eingebaute pre_save verwenden , post_save, pre_delete, und post_delete Signale. 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 und post_delete wird ausgelöst, wenn Sie delete() aufrufen auf einem Abfragesatz.

Für die Massenaktualisierung müssen Sie die Funktion, die Sie auslösen möchten, jedoch manuell aufrufen. Und Sie können alles auch in eine Transaktion werfen.

Um die richtige Triggerfunktion aufzurufen, wenn Sie dynamische Modelle verwenden, können Sie den ContentType des Modells überprüfen. Zum Beispiel:

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)