Hi everyone, I've spent some days thinking about a use case we have internally where we want to create some database records automatically based on some other records, think e.g. of an audit log where whenever an instance of model X is changed, we want to create an instance of model Y as a log record. Of course, there are *lots* of ways and libraries that allow you to do this with Django, mostly somehow circling around overriding `save()` or using the `post_save` signal.
However, we want to do this in an *aggregated* way, i.e. even if you add hundreds of model instances in the same transaction, we only want *one* new line in our audit log to be created. This is impossible with `save()` or `post_save` alone since we can't know which change is the "last" that should trigger the audit log to be created. I figured a perfect way to do this would be using `save()` or `post_save` to add the changed model instance to some kind of thread-local list, and then using `transaction.on_commit` to "schedule" the aggregation and create the log entries when all changes have been made. However, this obviously is not a good enough because `on_commit` runs *after* the `COMMIT` statement and thus we're not guaranteed that all log entries are persisted to the database. So I was wondering if there was potential for a `transaction.on_before_commit` that works just like `transaction.on_commit` except that it is executed before the `COMMIT` statement. I imagine there are lots of other possible uses as well and without looking into it much deeper, it seems easy enough to implement. Does anyone have opinions on whether or not this would be a good feature to add to Django? Unfortunately it doesn't seem possible to do this as third-party code (except if we were shipping entire database backends) so it would need to be an acceptable change to Django to be a viable option. Thanks Raphael -- You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-developers+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/20211010155522.6489b86d%40amara.localdomain.
pgpl51uPmIu7I.pgp
Description: Digitale Signatur von OpenPGP