Commit e008a10c authored by Thomas Chaumeny's avatar Thomas Chaumeny Committed by Loic Bistuer
Browse files

Fixed #23443 -- Corrected erroneous FieldError message.

Thanks Tim Graham for the review.
parent abc11b0a
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -1370,9 +1370,13 @@ class Query(object):
            try:
                field, model, direct, m2m = opts.get_field_by_name(name)
            except FieldDoesNotExist:
                # We didn't found the current field, so move position back
                # We didn't find the current field, so move position back
                # one step.
                pos -= 1
                if pos == -1 or fail_on_missing:
                    available = opts.get_all_field_names() + list(self.aggregate_select)
                    raise FieldError("Cannot resolve keyword %r into field. "
                                     "Choices are: %s" % (name, ", ".join(available)))
                break
            # Check if we need any joins for concrete inheritance cases (the
            # field lives in parent, but we are currently in one of its
@@ -1412,16 +1416,13 @@ class Query(object):
                # Local non-relational field.
                final_field = field
                targets = (field,)
                if fail_on_missing and pos + 1 != len(names):
                    raise FieldError(
                        "Cannot resolve keyword %r into field. Join on '%s'"
                        " not permitted." % (names[pos + 1], name))
                break
        if pos == -1 or (fail_on_missing and pos + 1 != len(names)):
            self.raise_field_error(opts, name)
        return path, final_field, targets, names[pos + 1:]

    def raise_field_error(self, opts, name):
        available = opts.get_all_field_names() + list(self.aggregate_select)
        raise FieldError("Cannot resolve keyword %r into field. "
                         "Choices are: %s" % (name, ", ".join(available)))

    def setup_joins(self, names, opts, alias, can_reuse=None, allow_many=True):
        """
        Compute the necessary table joins for the passage through the fields
+7 −0
Original line number Diff line number Diff line
@@ -2164,6 +2164,13 @@ class ValuesQuerysetTests(BaseQuerysetTest):
        qs = qs.values_list('num', flat=True)
        self.assertQuerysetEqual(qs, [72], self.identity)

    def test_field_error_values_list(self):
        # see #23443
        with self.assertRaisesMessage(FieldError,
                "Cannot resolve keyword %r into field."
                " Join on 'name' not permitted." % 'foo'):
            Tag.objects.values_list('name__foo')


class QuerySetSupportsPythonIdioms(TestCase):