Fixed #30548 -- Improved exception when expression contains mixed types.

This commit is contained in:
CruxBox 2019-06-10 03:32:40 +05:30 committed by Mariusz Felisiak
parent 03cd3d137e
commit 34f8eeea4a
2 changed files with 13 additions and 3 deletions

View File

@ -286,8 +286,15 @@ class BaseExpression:
""" """
sources_iter = (source for source in self.get_source_fields() if source is not None) sources_iter = (source for source in self.get_source_fields() if source is not None)
for output_field in sources_iter: for output_field in sources_iter:
if any(not isinstance(output_field, source.__class__) for source in sources_iter): for source in sources_iter:
raise FieldError('Expression contains mixed types. You must set output_field.') if not isinstance(output_field, source.__class__):
raise FieldError(
'Expression contains mixed types: %s, %s. You must '
'set output_field.' % (
output_field.__class__.__name__,
source.__class__.__name__,
)
)
return output_field return output_field
@staticmethod @staticmethod

View File

@ -884,7 +884,10 @@ class AggregateTestCase(TestCase):
self.assertEqual(p2, {'avg_price': Approximate(Decimal('53.39'), places=2)}) self.assertEqual(p2, {'avg_price': Approximate(Decimal('53.39'), places=2)})
def test_combine_different_types(self): def test_combine_different_types(self):
msg = 'Expression contains mixed types. You must set output_field.' msg = (
'Expression contains mixed types: FloatField, IntegerField. '
'You must set output_field.'
)
qs = Book.objects.annotate(sums=Sum('rating') + Sum('pages') + Sum('price')) qs = Book.objects.annotate(sums=Sum('rating') + Sum('pages') + Sum('price'))
with self.assertRaisesMessage(FieldError, msg): with self.assertRaisesMessage(FieldError, msg):
qs.first() qs.first()