[Django] #27340: Model pre_init signal should provide an `instance` argument

13 views
Skip to first unread message

Django

unread,
Oct 12, 2016, 9:30:23 PM10/12/16
to django-...@googlegroups.com
#27340: Model pre_init signal should provide an `instance` argument
--------------------------------+--------------------
Reporter: Ask Solem Hoel | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 1.10
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
--------------------------------+--------------------
I struggle to find reasons as to why this argument is ommitted.

The current signature for pre_init is:

{{{
class Model(six.with_metaclass(ModelBase)):
_deferred = False

def __init__(self, *args, **kwargs):
signals.pre_init.send(sender=self.__class__, args=args,
kwargs=kwargs)
}}}

I suggest that the signature should be:

{{{
class Model(six.with_metaclass(ModelBase)):
_deferred = False

def __init__(self, *args, **kwargs):
signals.pre_init.send(sender=self.__class__, args=args,
kwargs=kwargs, instance=self)
}}}

Or alternatively, that the `post_init` signal contains the args and kwargs
used to construct the model.

The reason for wanting access to the instance in pre_init is that I want
to track changes
to the model since it was first retrieved from the database - This is
currently not possible without subclassing Model,
and that is not a realistic option for us as we deal with third party
models.

The current way we handle this is by using `pre_save` to fetch the row
from the database again, but this is suboptimal
and this a simple change would allow us to do this.

--
Ticket URL: <https://code.djangoproject.com/ticket/27340>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Oct 12, 2016, 9:31:03 PM10/12/16
to django-...@googlegroups.com
#27340: Model pre_init signal should provide an `instance` argument
-------------------------------------+-------------------------------------

Reporter: Ask Solem Hoel | Owner: nobody
Type: New feature | Status: new
Component: Database layer | Version: 1.10
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Ask Solem Hoel):

* needs_docs: => 0
* needs_better_patch: => 0
* component: Uncategorized => Database layer (models, ORM)
* needs_tests: => 0
* type: Uncategorized => New feature


--
Ticket URL: <https://code.djangoproject.com/ticket/27340#comment:1>

Django

unread,
Oct 13, 2016, 9:55:27 AM10/13/16
to django-...@googlegroups.com
#27340: Model pre_init signal should provide an `instance` argument
-------------------------------------+-------------------------------------

Reporter: Ask Solem Hoel | Owner: nobody
Type: New feature | Status: new
Component: Database layer | Version: 1.10
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by Tim Graham):

Could you provide an example of your existing code and what it would look
like after this change? I'll check that I don't see another way to
accomplish your use case.

--
Ticket URL: <https://code.djangoproject.com/ticket/27340#comment:2>

Django

unread,
Oct 22, 2016, 7:04:20 PM10/22/16
to django-...@googlegroups.com
#27340: Model pre_init signal should provide an `instance` argument
-------------------------------------+-------------------------------------

Reporter: Ask Solem Hoel | Owner: nobody
Type: New feature | Status: closed

Component: Database layer | Version: 1.10
(models, ORM) |
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage:
| Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Tim Graham):

* status: new => closed
* resolution: => needsinfo


--
Ticket URL: <https://code.djangoproject.com/ticket/27340#comment:3>

Django

unread,
Oct 26, 2016, 2:15:04 PM10/26/16
to django-...@googlegroups.com
#27340: Model pre_init signal should provide an `instance` argument
-------------------------------------+-------------------------------------

Reporter: Ask Solem Hoel | Owner: nobody
Type: New feature | Status: closed
Component: Database layer | Version: 1.10
(models, ORM) |
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage:
| Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by Ask Solem Hoel):

lol, you want an example. Brace yourself, will probably be more difficult
to understand, but here:

https://github.com/robinhood/thorn/blob/master/thorn/django/signals.py#L39-L44

we use the pre)save signal to store a snapshot of how the model looked
like before it was changed


With the proposed change we'd be able to avoid doing two database queries
for every Model.save by doing this:


@signals.pre_init.connect
def _track_changes(instance, args, kwargs, **kwargs):
instance._original_args = args, kwargs

There's no other way as far as I can find, as we don't want to monkeypatch
Model, and in any case it's very strange that the pre_init signal omits
the instance being created.

--
Ticket URL: <https://code.djangoproject.com/ticket/27340#comment:4>

Reply all
Reply to author
Forward
0 new messages