Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #7778 -- Fixed a tricky case of foreign key clearing with inher…

…ited

models. Patch from James Murty.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@8100 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 3cbe73692eb5bdd45227c5957f7bc1801974722b 1 parent ccab4b0
@malcolmt malcolmt authored
View
1  AUTHORS
@@ -280,6 +280,7 @@ answer newbie questions, and generally made Django that much better:
Eric Moritz <http://eric.themoritzfamily.com/>
mrmachine <real.human@mrmachine.net>
Robin Munn <http://www.geekforgod.com/>
+ James Murty
msundstr
Robert Myers <myer0052@gmail.com>
Nebojša Dorđević
View
4 django/db/models/query.py
@@ -836,7 +836,9 @@ def delete_objects(seen_objs):
update_query = sql.UpdateQuery(cls, connection)
for field in cls._meta.fields:
- if field.rel and field.null and field.rel.to in seen_objs:
+ if (field.rel and field.null and field.rel.to in seen_objs and
+ filter(lambda f: f.column == field.column,
+ field.rel.to._meta.fields)):
update_query.clear_related(field, pk_list)
# Now delete the actual data.
View
28 tests/regressiontests/queries/models.py
@@ -190,6 +190,19 @@ class Meta:
class Related(models.Model):
custom = models.ForeignKey(CustomPk)
+# An inter-related setup with a model subclass that has a nullable
+# path to another model, and a return path from that model.
+
+class Celebrity(models.Model):
+ name = models.CharField("Name", max_length=20)
+ greatest_fan = models.ForeignKey("Fan", null=True, unique=True)
+
+class TvChef(Celebrity):
+ pass
+
+class Fan(models.Model):
+ fan_of = models.ForeignKey(Celebrity)
+
__test__ = {'API_TESTS':"""
>>> t1 = Tag.objects.create(name='t1')
@@ -836,6 +849,21 @@ class Related(models.Model):
>>> len(Note.objects.order_by('extrainfo__info').distinct())
3
+Bug #7778 - Model subclasses could not be deleted if a nullable foreign key
+relates to a model that relates back.
+
+>>> num_celebs = Celebrity.objects.count()
+>>> tvc = TvChef.objects.create(name="Huey")
+>>> Celebrity.objects.count() == num_celebs + 1
+True
+>>> f1 = Fan.objects.create(fan_of=tvc)
+>>> f2 = Fan.objects.create(fan_of=tvc)
+>>> tvc.delete()
+
+# The parent object should have been deleted as well.
+>>> Celebrity.objects.count() == num_celebs
+True
+
"""}
# In Python 2.3, exceptions raised in __len__ are swallowed (Python issue
Please sign in to comment.
Something went wrong with that request. Please try again.