mirror of https://github.com/django/django.git
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.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12910 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
5e5203c7d7
commit
f92d73fbd4
|
@ -131,7 +131,7 @@ class UpdateQuery(Query):
|
||||||
for model, values in self.related_updates.iteritems():
|
for model, values in self.related_updates.iteritems():
|
||||||
query = UpdateQuery(model)
|
query = UpdateQuery(model)
|
||||||
query.values = values
|
query.values = values
|
||||||
if self.related_ids:
|
if self.related_ids is not None:
|
||||||
query.add_filter(('pk__in', self.related_ids))
|
query.add_filter(('pk__in', self.related_ids))
|
||||||
result.append(query)
|
result.append(query)
|
||||||
return result
|
return result
|
||||||
|
|
|
@ -21,6 +21,19 @@ class RelatedPoint(models.Model):
|
||||||
return unicode(self.name)
|
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': """
|
__test__ = {'API_TESTS': """
|
||||||
>>> DataPoint(name="d0", value="apple").save()
|
>>> DataPoint(name="d0", value="apple").save()
|
||||||
>>> DataPoint(name="d2", value="banana").save()
|
>>> DataPoint(name="d2", value="banana").save()
|
||||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue