#6870: pre_delete should be sent before collecting ForeignKey relationships
---------------------------------------------+------------------------------
          Reporter:  wkornewald              |         Owner:  nobody
            Status:  new                     |     Milestone:        
         Component:  Core framework          |       Version:  SVN   
        Resolution:                          |      Keywords:        
             Stage:  Design decision needed  |     Has_patch:  1     
        Needs_docs:  1                       |   Needs_tests:  1     
Needs_better_patch:  0                       |  
---------------------------------------------+------------------------------
Changes (by cgieringer):

 * cc: cgieringer (added)
  * needs_docs:  0 => 1
  * has_patch:  0 => 1
  * needs_tests:  0 => 1

Comment:

 I agree with the ticket creator that django should send the pre_delete
 signal at a time when it is still possible to modify the model in a way
 that affects deletion.  It seems that the contract of all pre_xx signal
 should include informing listeners before any undoable changes have
 occurred in the deletion, save, etc.

 The most common usage for a correctly behaving pre_delete signal is
 apparently to remove related objects to prevent cascade deletion, and the
 feature requested in #7539 would eventually provide another means to that
 usage.  But that possible feature doesn't change the fact that pre_delete
 breaks its contract (or what it seems its contract should be) by
 collecting the related objects for deletion before informing listeners
 that the objects will be deleted, thereby offering no consistent way to
 prevent cascade deletion.  The only way to get around this limitation is
 to define both a custom model delete and manager delete for each model
 requiring this functionality, which is a tedious and error-prone
 requirement.

 Currently the pre_delete signal is sent from
 django.db.models.query.delete_objects.  The least-complicated place to
 send the signal while meeting its contract is from the beginning of
 _collect_sub_objects, because this is both the first place that related
 objects are seen (as that method traverses relations from the original
 model) and the last place that a change to a model's related objects can
 be made before they are cached in seen_objects and then sent for deletion.

 I have attached a patch which adds a pre_signal argument to
 django.db.model.base.Model's _collect_sub_objects.  The argument should be
 one of Django's signals from django.db.models.signals, and it will be
 called at the beginning of the method if the model was not autocreated.
 The argument is called pre_signal because although _collect_sub_objects is
 presently only used for finding related objects for deletion, it could
 possibly be used for some other purpose for which a different pre_xx
 signal should be sent.  The patch adds _collect_sub_objects(...,
 pre_signal=pre_signal) to recursions and _collect_sub_objects(...,
 pre_signal=pre_delete) to the two places the method is called.  It removes
 the sending of pre_delete from delete_objects.

 Thank you to all the Django developers, this framework is my favorite
 piece of software.

-- 
Ticket URL: <http://code.djangoproject.com/ticket/6870#comment:5>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to