From a1d2f6ef0cfd48c9999edfd8b24766257f58d2d5 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Fri, 29 Aug 2008 02:40:50 +0000 Subject: [PATCH] Fixed #7823 -- Fixed an edge case in RelatedField.get_db_prep_lookup() so that it works correctly with custom field subclasses. Patch from Ivan Sagalaev. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8690 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/fields/related.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index db606e5042..bd453e53b1 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -125,12 +125,18 @@ class RelatedField(object): # that object. In certain conditions (especially one-to-one relations), # the primary key may itself be an object - so we need to keep drilling # down until we hit a value that can be used for a comparison. - v = value + v, field = value, None try: while True: - v = getattr(v, v._meta.pk.name) + v, field = getattr(v, v._meta.pk.name), v._meta.pk except AttributeError: pass + if field: + if lookup_type in ('range', 'in'): + v = [v] + v = field.get_db_prep_lookup(lookup_type, v) + if isinstance(v, list): + v = v[0] return v if hasattr(value, 'as_sql'): @@ -138,7 +144,7 @@ class RelatedField(object): return QueryWrapper(('(%s)' % sql), params) if lookup_type == 'exact': return [pk_trace(value)] - if lookup_type == 'in': + if lookup_type in ('range', 'in'): return [pk_trace(v) for v in value] elif lookup_type == 'isnull': return []