Fixed #24744 - Fixed relabeled_clone for the Transform

This commit is contained in:
Andriy Sokolovskiy 2015-06-04 15:51:07 +01:00 committed by Tim Graham
parent dee1bcd08a
commit 08232ef84d
3 changed files with 23 additions and 1 deletions

View File

@ -70,8 +70,13 @@ class Transform(RegisterLookupMixin):
def output_field(self):
return self.lhs.output_field
def copy(self):
return copy(self)
def relabeled_clone(self, relabels):
return self.__class__(self.lhs.relabeled_clone(relabels))
copy = self.copy()
copy.lhs = self.lhs.relabeled_clone(relabels)
return copy
def get_group_by_cols(self):
return self.lhs.get_group_by_cols()

View File

@ -57,3 +57,5 @@ Bugfixes
* Corrected join promotion for multiple ``Case`` expressions. Annotating a
query with multiple ``Case`` expressions could unexpectedly filter out
results (:ticket:`24924`).
* Fixed usage of transforms in subqueries (:ticket:`24744`).

View File

@ -559,3 +559,18 @@ class CustomisedMethodsTests(TestCase):
def test_overridden_get_transform_chain(self):
q = CustomModel.objects.filter(field__transformfunc_banana__transformfunc_pear=3)
self.assertIn('pear()', str(q.query))
class SubqueryTransformTests(TestCase):
def test_subquery_usage(self):
models.IntegerField.register_lookup(Div3Transform)
try:
Author.objects.create(name='a1', age=1)
a2 = Author.objects.create(name='a2', age=2)
Author.objects.create(name='a3', age=3)
Author.objects.create(name='a4', age=4)
self.assertQuerysetEqual(
Author.objects.order_by('name').filter(id__in=Author.objects.filter(age__div3=2)),
[a2], lambda x: x)
finally:
models.IntegerField._unregister_lookup(Div3Transform)