diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-07-27 04:18:52 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-07-27 04:18:52 +0000 |
| commit | 3cbe73692eb5bdd45227c5957f7bc1801974722b (patch) | |
| tree | fef0baf3664d9a4f67671e28c7ef7c9cf310ca09 | |
| parent | ccab4b041bded4af529ca2ede4dffab0d95fb5f2 (diff) | |
Fixed #7778 -- Fixed a tricky case of foreign key clearing with inherited
models. Patch from James Murty.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8100 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/db/models/query.py | 4 | ||||
| -rw-r--r-- | tests/regressiontests/queries/models.py | 28 |
3 files changed, 32 insertions, 1 deletions
@@ -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ć diff --git a/django/db/models/query.py b/django/db/models/query.py index 2aa5b33c74..92395a3c4a 100644 --- a/django/db/models/query.py +++ b/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. diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index 5231eac8be..4ba519a08e 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -190,6 +190,19 @@ class CustomPk(models.Model): 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 @@ related via ForeignKeys. >>> 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 |
