Author: jbronn
Date: 2009-12-18 19:11:33 -0600 (Fri, 18 Dec 2009)
New Revision: 11911

Added:
   django/branches/soc2009/multidb/tests/regressiontests/defer_regress/tests.py
Modified:
   django/branches/soc2009/multidb/django/db/models/sql/compiler.py
   django/branches/soc2009/multidb/tests/regressiontests/defer_regress/models.py
Log:
[soc2009/multidb] Fixed #12402 -- `QuerySet.defer` now interacts properly with 
`SQLCompiler` subclasses that implement `resolve_columns`.


Modified: django/branches/soc2009/multidb/django/db/models/sql/compiler.py
===================================================================
--- django/branches/soc2009/multidb/django/db/models/sql/compiler.py    
2009-12-18 10:08:05 UTC (rev 11910)
+++ django/branches/soc2009/multidb/django/db/models/sql/compiler.py    
2009-12-19 01:11:33 UTC (rev 11911)
@@ -627,6 +627,13 @@
                             fields = self.query.select_fields + 
self.query.related_select_fields
                         else:
                             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)
 
                 if self.query.aggregate_select:

Modified: 
django/branches/soc2009/multidb/tests/regressiontests/defer_regress/models.py
===================================================================
--- 
django/branches/soc2009/multidb/tests/regressiontests/defer_regress/models.py   
    2009-12-18 10:08:05 UTC (rev 11910)
+++ 
django/branches/soc2009/multidb/tests/regressiontests/defer_regress/models.py   
    2009-12-19 01:11:33 UTC (rev 11911)
@@ -31,6 +31,10 @@
     def __unicode__(self):
         return self.name
 
+class ResolveThis(models.Model):
+    num = models.FloatField()
+    name = models.CharField(max_length=16)
+
 __test__ = {"regression_tests": """
 Deferred fields should really be deferred and not accidentally use the field's
 default value just because they aren't passed to __init__.

Added: 
django/branches/soc2009/multidb/tests/regressiontests/defer_regress/tests.py
===================================================================
--- 
django/branches/soc2009/multidb/tests/regressiontests/defer_regress/tests.py    
                            (rev 0)
+++ 
django/branches/soc2009/multidb/tests/regressiontests/defer_regress/tests.py    
    2009-12-19 01:11:33 UTC (rev 11911)
@@ -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)

--

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