Explorar el Código

Fixed #24951 -- Fixed AssertionError in delete queries involving a foreign/primary key.

Thanks Anssi Kääriäinen for help.
Tim Graham hace 9 años
padre
commit
333cbdcd2d

+ 1 - 1
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])]

+ 2 - 1
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`).

+ 1 - 1
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):

+ 9 - 1
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.