Author: russellm
Date: 2010-04-03 06:45:31 -0500 (Sat, 03 Apr 2010)
New Revision: 12910

Added:
   django/trunk/tests/modeltests/update/tests.py
Modified:
   django/trunk/django/db/models/sql/subqueries.py
   django/trunk/tests/modeltests/update/models.py
Log:
Fixed #12247 -- Corrected the way update queries are processed when the update 
only refers to attributes on a base class. Thanks to jsmullyan for the report, 
and matiasb for the fix.

Modified: django/trunk/django/db/models/sql/subqueries.py
===================================================================
--- django/trunk/django/db/models/sql/subqueries.py     2010-04-02 15:52:58 UTC 
(rev 12909)
+++ django/trunk/django/db/models/sql/subqueries.py     2010-04-03 11:45:31 UTC 
(rev 12910)
@@ -131,7 +131,7 @@
         for model, values in self.related_updates.iteritems():
             query = UpdateQuery(model)
             query.values = values
-            if self.related_ids:
+            if self.related_ids is not None:
                 query.add_filter(('pk__in', self.related_ids))
             result.append(query)
         return result

Modified: django/trunk/tests/modeltests/update/models.py
===================================================================
--- django/trunk/tests/modeltests/update/models.py      2010-04-02 15:52:58 UTC 
(rev 12909)
+++ django/trunk/tests/modeltests/update/models.py      2010-04-03 11:45:31 UTC 
(rev 12910)
@@ -21,6 +21,19 @@
         return unicode(self.name)
 
 
+class A(models.Model):
+    x = models.IntegerField(default=10)
+
+class B(models.Model):
+    a = models.ForeignKey(A)
+    y = models.IntegerField(default=10)
+
+class C(models.Model):
+    y = models.IntegerField(default=10)
+
+class D(C):
+    a = models.ForeignKey(A)
+
 __test__ = {'API_TESTS': """
 >>> DataPoint(name="d0", value="apple").save()
 >>> DataPoint(name="d2", value="banana").save()

Added: django/trunk/tests/modeltests/update/tests.py
===================================================================
--- django/trunk/tests/modeltests/update/tests.py                               
(rev 0)
+++ django/trunk/tests/modeltests/update/tests.py       2010-04-03 11:45:31 UTC 
(rev 12910)
@@ -0,0 +1,49 @@
+from django.test import TestCase
+
+from models import A, B, D
+
+class SimpleTest(TestCase):
+    def setUp(self):
+        self.a1 = A.objects.create()
+        self.a2 = A.objects.create()
+        for x in range(20):
+            B.objects.create(a=self.a1)
+            D.objects.create(a=self.a1)
+
+    def test_nonempty_update(self):
+        """
+        Test that update changes the right number of rows for a nonempty 
queryset
+        """
+        num_updated = self.a1.b_set.update(y=100)
+        self.failUnlessEqual(num_updated, 20)
+        cnt = B.objects.filter(y=100).count()
+        self.failUnlessEqual(cnt, 20)
+
+    def test_empty_update(self):
+        """
+        Test that update changes the right number of rows for an empty queryset
+        """
+        num_updated = self.a2.b_set.update(y=100)
+        self.failUnlessEqual(num_updated, 0)
+        cnt = B.objects.filter(y=100).count()
+        self.failUnlessEqual(cnt, 0)
+
+    def test_nonempty_update_with_inheritance(self):
+        """
+        Test that update changes the right number of rows for an empty queryset
+        when the update affects only a base table
+        """
+        num_updated = self.a1.d_set.update(y=100)
+        self.failUnlessEqual(num_updated, 20)
+        cnt = D.objects.filter(y=100).count()
+        self.failUnlessEqual(cnt, 20)
+
+    def test_empty_update_with_inheritance(self):
+        """
+        Test that update changes the right number of rows for an empty queryset
+        when the update affects only a base table
+        """
+        num_updated = self.a2.d_set.update(y=100)
+        self.failUnlessEqual(num_updated, 0)
+        cnt = D.objects.filter(y=100).count()
+        self.failUnlessEqual(cnt, 0)

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to