1
0
mirror of https://github.com/django/django.git synced 2025-07-05 02:09:13 +00:00

[soc2009/multidb] Fixed #12402 -- QuerySet.defer now interacts properly with SQLCompiler subclasses that implement resolve_columns.

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/multidb@11911 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Justin Bronn 2009-12-19 01:11:33 +00:00
parent e95bc7b50d
commit df2746b16c
3 changed files with 20 additions and 0 deletions

View File

@ -627,6 +627,13 @@ class SQLCompiler(object):
fields = self.query.select_fields + self.query.related_select_fields fields = self.query.select_fields + self.query.related_select_fields
else: else:
fields = self.query.model._meta.fields fields = self.query.model._meta.fields
# If the field was deferred, exclude it from being passed
# into `resolve_columns` because it wasn't selected.
only_load = self.deferred_to_columns()
if only_load:
db_table = self.query.model._meta.db_table
fields = [f for f in fields if db_table in only_load and
f.column in only_load[db_table]]
row = self.resolve_columns(row, fields) row = self.resolve_columns(row, fields)
if self.query.aggregate_select: if self.query.aggregate_select:

View File

@ -31,6 +31,10 @@ class Leaf(models.Model):
def __unicode__(self): def __unicode__(self):
return self.name return self.name
class ResolveThis(models.Model):
num = models.FloatField()
name = models.CharField(max_length=16)
__test__ = {"regression_tests": """ __test__ = {"regression_tests": """
Deferred fields should really be deferred and not accidentally use the field's Deferred fields should really be deferred and not accidentally use the field's
default value just because they aren't passed to __init__. default value just because they aren't passed to __init__.

View File

@ -0,0 +1,9 @@
from django.test import TestCase
from models import ResolveThis
class DeferRegressionTest(TestCase):
def test_resolve_columns(self):
rt = ResolveThis.objects.create(num=5.0, name='Foobar')
qs = ResolveThis.objects.defer('num')
self.assertEqual(1, qs.count())
self.assertEqual('Foobar', qs[0].name)