from django.db import models
class Model(models.Model):
"""
Intermediate model base class.
"""
class Meta:
abstract = True
def delete(self, *args, **kwargs):
self.clear_nullable_related()
super(Model, self).delete(*args, **kwargs)
def clear_nullable_related(self):
"""
Recursively clears any nullable foreign key fields on related objects.
Django is hard-wired for cascading deletes, which is very dangerous for
us. This simulates ON DELETE SET NULL behavior manually.
"""
for related in self._meta.get_all_related_objects():
accessor = related.get_accessor_name()
related_set = getattr(self, accessor)
if related.field.null:
related_set.clear()
else:
for related_object in related_set.all():
related_object.clear_nullable_related()
Comments
psagers, I'm not on 1.0 yet, but reading the code in model.delete() and delete_objects(), it sure looks to me like Django goes out of its way to avoid deleting nullable foreign keys on model_instance.delete.
Is this an actual problem you're seeing? Are you doing Model.delete or QuerySet.delete?
In any case, it sounds like it might be a bug. Did you file a ticket?
#
@jdunck this is still a problem. Even in Django 1.2.1
#
I've modified clear_nullable_related() because I was getting exceptions in some cases. Here is my modified code:
#
Django 1.3 has support for "ON DELETE": ForeignKey.on_delete
#