sql >> Database >  >> RDS >> PostgreSQL

Django emuleert het triggergedrag van de database bij bulksgewijs invoegen/bijwerken/verwijderen

Ten eerste, in plaats van opslaan te overschrijven om __before toe te voegen en __after methoden, kunt u de ingebouwde pre_save , post_save, pre_delete, en post_delete signalen. 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 en post_delete wordt geactiveerd wanneer u delete() aanroept op een queryset.

Voor bulkupdates moet je de functie die je wilt activeren echter handmatig aanroepen. En je kunt het ook allemaal in een transactie gooien.

Om de juiste triggerfunctie aan te roepen als u dynamische modellen gebruikt, kunt u het ContentType van het model inspecteren. Bijvoorbeeld:

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. hoe ziet een B-tree index op meer dan 1 kolom eruit?

  2. PostgreSQL-schema's / naamruimten met Django

  3. Postgres:onderscheiden maar slechts voor één kolom

  4. SQL afkappen