diff options
| author | Tim Graham <timograham@gmail.com> | 2015-08-05 15:52:11 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-08-20 08:14:16 -0400 |
| commit | 333cbdcd2de4546e33ad50ebd8b67e1a1e87aeec (patch) | |
| tree | f2cc68bc4557f9e5fa560f1214735c9e97039959 | |
| parent | 1b8d7eff3bb1de1f0b51137d720d6fcf7622bced (diff) | |
Fixed #24951 -- Fixed AssertionError in delete queries involving a foreign/primary key.
Thanks Anssi Kääriäinen for help.
| -rw-r--r-- | django/db/models/sql/compiler.py | 2 | ||||
| -rw-r--r-- | docs/releases/1.8.5.txt | 3 | ||||
| -rw-r--r-- | tests/one_to_one/models.py | 2 | ||||
| -rw-r--r-- | tests/one_to_one/tests.py | 10 |
4 files changed, 13 insertions, 4 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 9d89269ee6..8b841f6d5e 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -995,7 +995,7 @@ class SQLDeleteCompiler(SQLCompiler): Creates the SQL for this query. Returns the SQL string and list of parameters. """ - assert len(self.query.tables) == 1, \ + assert len([t for t in self.query.tables if self.query.alias_refcount[t] > 0]) == 1, \ "Can only delete from one table at a time." qn = self.quote_name_unless_alias result = ['DELETE FROM %s' % qn(self.query.tables[0])] diff --git a/docs/releases/1.8.5.txt b/docs/releases/1.8.5.txt index 43a959197b..df7783f4df 100644 --- a/docs/releases/1.8.5.txt +++ b/docs/releases/1.8.5.txt @@ -9,4 +9,5 @@ Django 1.8.5 fixes several bugs in 1.8.4. Bugfixes ======== -* ... +* Fixed ``AssertionError`` in some delete queries with a model containing a + field that is both a foreign and primary key (:ticket:`24951`). diff --git a/tests/one_to_one/models.py b/tests/one_to_one/models.py index 788d81a592..2742fb186e 100644 --- a/tests/one_to_one/models.py +++ b/tests/one_to_one/models.py @@ -83,7 +83,7 @@ class MultiModel(models.Model): class Target(models.Model): - pass + name = models.CharField(max_length=50) class Pointer(models.Model): diff --git a/tests/one_to_one/tests.py b/tests/one_to_one/tests.py index ee0536906c..49da8dfbd2 100644 --- a/tests/one_to_one/tests.py +++ b/tests/one_to_one/tests.py @@ -5,7 +5,8 @@ from django.test import TestCase from .models import ( Bar, Director, Favorites, HiddenPointer, ManualPrimaryKey, MultiModel, - Place, RelatedModel, Restaurant, School, Target, UndergroundBar, Waiter, + Place, Pointer, RelatedModel, Restaurant, School, Target, UndergroundBar, + Waiter, ) @@ -256,6 +257,13 @@ class OneToOneTests(TestCase): [] ) + def test_o2o_primary_key_delete(self): + t = Target.objects.create(name='name') + Pointer.objects.create(other=t) + num_deleted, objs = Pointer.objects.filter(other__name='name').delete() + self.assertEqual(num_deleted, 1) + self.assertEqual(objs, {'one_to_one.Pointer': 1}) + def test_reverse_object_does_not_exist_cache(self): """ Regression for #13839 and #17439. |
