mirror of
https://github.com/django/django.git
synced 2024-12-22 09:05:43 +00:00
Fixed #34450 -- Fixed multi-valued JOIN reuse when filtering by expressions.
Thanks Roman Odaisky for the report.
This commit is contained in:
parent
79a3ea83b1
commit
0e1aae7a5f
@ -1373,7 +1373,7 @@ class Query(BaseExpression):
|
||||
if not getattr(filter_expr, "conditional", False):
|
||||
raise TypeError("Cannot filter against a non-conditional expression.")
|
||||
condition = filter_expr.resolve_expression(
|
||||
self, allow_joins=allow_joins, summarize=summarize
|
||||
self, allow_joins=allow_joins, reuse=can_reuse, summarize=summarize
|
||||
)
|
||||
if not isinstance(condition, Lookup):
|
||||
condition = self.build_lookup(["exact"], condition, True)
|
||||
|
@ -1357,6 +1357,9 @@ class LookupQueryingTests(TestCase):
|
||||
cls.s1 = Season.objects.create(year=1942, gt=1942)
|
||||
cls.s2 = Season.objects.create(year=1842, gt=1942, nulled_text_field="text")
|
||||
cls.s3 = Season.objects.create(year=2042, gt=1942)
|
||||
Game.objects.create(season=cls.s1, home="NY", away="Boston")
|
||||
Game.objects.create(season=cls.s1, home="NY", away="Tampa")
|
||||
Game.objects.create(season=cls.s3, home="Boston", away="Tampa")
|
||||
|
||||
def test_annotate(self):
|
||||
qs = Season.objects.annotate(equal=Exact(F("year"), 1942))
|
||||
@ -1527,3 +1530,19 @@ class LookupQueryingTests(TestCase):
|
||||
{"year": 2042, "century": "other"},
|
||||
],
|
||||
)
|
||||
|
||||
def test_multivalued_join_reuse(self):
|
||||
self.assertEqual(
|
||||
Season.objects.get(Exact(F("games__home"), "NY"), games__away="Boston"),
|
||||
self.s1,
|
||||
)
|
||||
self.assertEqual(
|
||||
Season.objects.get(Exact(F("games__home"), "NY") & Q(games__away="Boston")),
|
||||
self.s1,
|
||||
)
|
||||
self.assertEqual(
|
||||
Season.objects.get(
|
||||
Exact(F("games__home"), "NY") & Exact(F("games__away"), "Boston")
|
||||
),
|
||||
self.s1,
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user