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)