Commit 1d9ee181 authored by Anssi Kääriäinen's avatar Anssi Kääriäinen Committed by Tim Graham
Browse files

[1.9.x] Fixed #26196 -- Made sure __in lookups use to_field as default.

Thanks Simon Charette for the test.

Backport of 46ecfb9b from master
parent 25496f0f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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.
        """
+1 −1
Original line number Diff line number Diff line
@@ -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',
+7 −1
Original line number Diff line number Diff line
@@ -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):
+1 −1
Original line number Diff line number Diff line
@@ -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):
+3 −0
Original line number Diff line number Diff line
@@ -21,3 +21,6 @@ Bugfixes
* Fixed a regression for cases where
  ``ForeignObject.get_extra_descriptor_filter()`` returned a ``Q`` object
  (:ticket:`26153`).

* Fixed regression with an ``__in=qs`` lookup for a ``ForeignKey`` with
  ``to_field`` set (:ticket:`26196`).
Loading