From e3ea668b47f6b7d63abd93a62b89f809cd3d5146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anssi=20K=C3=A4=C3=A4ri=C3=A4inen?= Date: Wed, 28 Nov 2012 23:52:50 +0200 Subject: [PATCH] [1.5.x] Fixed #14694 again -- Made defer() works with reverse relations Master and stable/1.5.x had diverged in models/query.py. --- django/db/models/query.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/django/db/models/query.py b/django/db/models/query.py index 67fef52f36c..9d0fbc02dc7 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1478,9 +1478,14 @@ def get_cached_row(row, index_start, using, klass_info, offset=0): # If the related object exists, populate # the descriptor cache. setattr(rel_obj, f.get_cache_name(), obj) - # Now populate all the non-local field values - # on the related object - for rel_field, rel_model in rel_obj._meta.get_fields_with_model(): + # Now populate all the non-local field values on the related + # object. If this object has deferred fields, we need to use + # the opts from the original model to get non-local fields + # correctly. + opts = rel_obj._meta + if getattr(rel_obj, '_deferred'): + opts = opts.proxy_for_model._meta + for rel_field, rel_model in opts.get_fields_with_model(): if rel_model is not None: setattr(rel_obj, rel_field.attname, getattr(obj, rel_field.attname)) # populate the field cache for any related object