summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/sql/compiler.py2
-rw-r--r--docs/releases/1.8.5.txt3
-rw-r--r--tests/one_to_one/models.py2
-rw-r--r--tests/one_to_one/tests.py10
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.