diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-08-29 02:40:50 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-08-29 02:40:50 +0000 |
| commit | a1d2f6ef0cfd48c9999edfd8b24766257f58d2d5 (patch) | |
| tree | 58398211e8eca72f8299bf4483f7459545cc78e7 | |
| parent | d22ee35ee9193e17e31125b722ac5bb9b3ac7d82 (diff) | |
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
| -rw-r--r-- | django/db/models/fields/related.py | 12 |
1 files 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 [] |
