diff options
| author | Alexander Holmbäck <alexande.holmback@creuna.se> | 2018-09-06 20:10:20 +0000 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-09-08 09:50:02 -0400 |
| commit | bd5ce0599bf0dc156b943ca0d03307c7e451923c (patch) | |
| tree | 09ac5baa362b6ba77ddb5962fb179156824aa7f8 | |
| parent | ed60ce55c2dd8a3940fa5ae9f1622f101c8421ad (diff) | |
[2.1.x] Fixed #29727 -- Made nonexistent joins in F() raise FieldError.
Regression in 2162f0983de0dfe2178531638ce7ea56f54dd4e7.
Backport of f315d0423a09dfe20dd4d4f6a0eb11fc8e45a665 from master
| -rw-r--r-- | django/db/models/sql/query.py | 5 | ||||
| -rw-r--r-- | docs/releases/2.1.2.txt | 3 | ||||
| -rw-r--r-- | tests/expressions/tests.py | 4 |
3 files changed, 10 insertions, 2 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index f11db05b9f..cf469cd686 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1568,10 +1568,13 @@ class Query: else: field_list = name.split(LOOKUP_SEP) join_info = self.setup_joins(field_list, self.get_meta(), self.get_initial_alias(), can_reuse=reuse) - targets, _, join_list = self.trim_joins(join_info.targets, join_info.joins, join_info.path) + targets, final_alias, join_list = self.trim_joins(join_info.targets, join_info.joins, join_info.path) if len(targets) > 1: raise FieldError("Referencing multicolumn fields with F() objects " "isn't supported") + # Verify that the last lookup in name is a field or a transform: + # transform_function() raises FieldError if not. + join_info.transform_function(targets[0], final_alias) if reuse is not None: reuse.update(join_list) col = targets[0].get_col(join_list[-1], join_info.targets[0]) diff --git a/docs/releases/2.1.2.txt b/docs/releases/2.1.2.txt index 4ac5e25ef7..17c50fffd7 100644 --- a/docs/releases/2.1.2.txt +++ b/docs/releases/2.1.2.txt @@ -9,4 +9,5 @@ Django 2.1.2 fixes several bugs in 2.1.1 Bugfixes ======== -* ... +* Fixed a regression where nonexistent joins in ``F()`` no longer raised + ``FieldError`` (:ticket:`29727`). diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py index 973176e223..9a646088b1 100644 --- a/tests/expressions/tests.py +++ b/tests/expressions/tests.py @@ -595,6 +595,10 @@ class BasicExpressionsTests(TestCase): with self.assertRaisesMessage(FieldError, "Cannot resolve keyword 'nope' into field."): list(Employee.objects.filter(firstname=F('nope'))) + def test_incorrect_joined_field_in_F_expression(self): + with self.assertRaisesMessage(FieldError, "Cannot resolve keyword 'nope' into field."): + list(Company.objects.filter(ceo__pk=F('point_of_contact__nope'))) + class IterableLookupInnerExpressionsTests(TestCase): @classmethod |
