diff options
| author | Anssi Kääriäinen <anssi.kaariainen@thl.fi> | 2016-02-11 08:39:37 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-02-11 11:09:55 -0500 |
| commit | 1d9ee181fe09a5c3784bbbf802cc522f11ff25ef (patch) | |
| tree | 631f3b6efd4de904401188b62fc0dc6150150f36 /django | |
| parent | 25496f0f7b953b9bca709ab20bc536137f57402d (diff) | |
[1.9.x] Fixed #26196 -- Made sure __in lookups use to_field as default.
Thanks Simon Charette for the test.
Backport of 46ecfb9b3a11a360724e3375ba78c33c46d6a992 from master
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/expressions.py | 2 | ||||
| -rw-r--r-- | django/db/models/fields/__init__.py | 2 | ||||
| -rw-r--r-- | django/db/models/query.py | 8 | ||||
| -rw-r--r-- | django/db/models/sql/query.py | 2 |
4 files changed, 10 insertions, 4 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index f03a2736b3..b5586686a2 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -210,7 +210,7 @@ class BaseExpression(object): ]) return c - def _prepare(self): + def _prepare(self, field): """ Hook used by Field.get_prep_lookup() to do custom preparation. """ diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 9449904130..df2e3b45de 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -732,7 +732,7 @@ class Field(RegisterLookupMixin): Perform preliminary non-db specific lookup checks and conversions """ if hasattr(value, '_prepare'): - return value._prepare() + return value._prepare(self) if lookup_type in { 'iexact', 'contains', 'icontains', diff --git a/django/db/models/query.py b/django/db/models/query.py index 852a5ba0dd..cb02085cc5 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1107,12 +1107,18 @@ class QuerySet(object): for field, objects in other._known_related_objects.items(): self._known_related_objects.setdefault(field, {}).update(objects) - def _prepare(self): + def _prepare(self, field): if self._fields is not None: # values() queryset can only be used as nested queries # if they are set up to select only a single field. if len(self._fields or self.model._meta.concrete_fields) > 1: raise TypeError('Cannot use multi-field values as a filter value.') + else: + # If the query is used as a subquery for a ForeignKey with non-pk + # target field, make sure to select the target field in the subquery. + foreign_fields = getattr(field, 'foreign_related_fields', ()) + if len(foreign_fields) == 1 and not foreign_fields[0].primary_key: + return self.values(foreign_fields[0].name) return self def _as_sql(self, connection): diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 2b446b9ef3..29fe885cc6 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -244,7 +244,7 @@ class Query(object): memo[id(self)] = result return result - def _prepare(self): + def _prepare(self, field): return self def get_compiler(self, using=None, connection=None): |
