sql >> Databasteknik >  >> RDS >> PostgreSQL

Django emulerar databasutlösarbeteende vid massinsättning/uppdatering/borttagning

Först, istället för att åsidosätta spara för att lägga till __before och __after metoder, kan du använda den inbyggda pre_save , post_save, pre_delete, och post_delete signaler. 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 och post_delete kommer att triggas när du anropar delete() på en frågeuppsättning.

För massuppdatering måste du dock manuellt anropa den funktion du vill utlösa själv. Och du kan lägga allt i en transaktion också.

För att anropa rätt triggerfunktion om du använder dynamiska modeller kan du inspektera modellens ContentType. Till exempel:

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)


  1. Skillnader mellan utf8 och latin1

  2. Spela 2.4 - Slick 3.0.0 - DELETE fungerar inte

  3. Hur får man en primärnyckel med nollvärden med hjälp av tom sträng?

  4. SQL Server ROWLOCK över en SELECT om den inte existerar INSERT transaktion