Skip to content

Commit 34f8eee

Browse files
CruxBoxfelixxm
authored andcommitted
Fixed #30548 -- Improved exception when expression contains mixed types.
1 parent 03cd3d1 commit 34f8eee

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

django/db/models/expressions.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,8 +286,15 @@ def _resolve_output_field(self):
286286
"""
287287
sources_iter = (source for source in self.get_source_fields() if source is not None)
288288
for output_field in sources_iter:
289-
if any(not isinstance(output_field, source.__class__) for source in sources_iter):
290-
raise FieldError('Expression contains mixed types. You must set output_field.')
289+
for source in sources_iter:
290+
if not isinstance(output_field, source.__class__):
291+
raise FieldError(
292+
'Expression contains mixed types: %s, %s. You must '
293+
'set output_field.' % (
294+
output_field.__class__.__name__,
295+
source.__class__.__name__,
296+
)
297+
)
291298
return output_field
292299

293300
@staticmethod

tests/aggregation/tests.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,10 @@ def test_order_of_precedence(self):
884884
self.assertEqual(p2, {'avg_price': Approximate(Decimal('53.39'), places=2)})
885885

886886
def test_combine_different_types(self):
887-
msg = 'Expression contains mixed types. You must set output_field.'
887+
msg = (
888+
'Expression contains mixed types: FloatField, IntegerField. '
889+
'You must set output_field.'
890+
)
888891
qs = Book.objects.annotate(sums=Sum('rating') + Sum('pages') + Sum('price'))
889892
with self.assertRaisesMessage(FieldError, msg):
890893
qs.first()

0 commit comments

Comments
 (0)