What are the options for overriding Django's cascading delete behaviour?

Just a note for those who run into this issue as well, there is now an built-in solution in Django 1.3.

See the details in the documentation django.db.models.ForeignKey.on_delete Thanks for editor of Fragments of Code site to point it out.

The simplest possible scenario just add in your model FK field definition:

on_delete=models.SET_NULL

Django only emulates CASCADE behaviour.

According to discussion in Django Users Group the most adequate solutions are:

  • To repeat ON DELETE SET NULL scenario - manually do obj.rel_set.clear() (for every related model) before obj.delete().
  • To repeat ON DELETE RESTRICT scenario - manually check is obj.rel_set empty before obj.delete().