My model is defined like this:
```
class Choice(models.Model):
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
arbitrary_num = models.PositiveIntegerField(default=1)
arbitrary_num2 = models.PositiveIntegerField(default=2)
```
And this query is failing with Oracle (Tested on 19.3), but not Postgres:
```
s = Coalesce(F('arbitrary_num') + F('arbitrary_num2'),
Value(0, PositiveIntegerField()))
case = Case(
When(arbitrary_num=1, then=Value(1, PositiveIntegerField())),
default=s,
output_field=PositiveIntegerField()
)
qs = Choice.objects.annotate(ss=case)
list(qs)
#qs = Choice.objects.annotate(s=s)
#list(qs)
```
The error (It's talking about the `Coalesce` function not having an
`output_field`):
```
django.core.exceptions.FieldError: Expression contains mixed types:
IntegerField, PositiveIntegerField. You must set output_field.
```
I believe the error is correct, because I think adding two
`PositiveIntegerField()` seem to result in an `IntegerField`, so we *need*
to specify an `output_field` on `Coalesce` to tell Django the proper
output type to use. My question is that this seem to only throw an error
in Oracle, and *not* Postgres. So it seems like the behavior on Postgres
is unexpected? Somehow, the `Case` statement swallows the exception in
Postgres and generates correct result. This can be demonstrated by the
queryset where the `Coalesce` function is annotated directly without a
case statement -- in this case, both Postgres and Oracle fails with the
above error.
Note that this used to work prior to 4.2 (we upgraded from 3.x, where this
used to work), although again I believe it was incorrect behavior and an
`output_field` *should* be specified.
--
Ticket URL: <https://code.djangoproject.com/ticket/34858>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
Old description:
New description:
Tested on Django 4.2.4.
qs = Choice.objects.annotate(ss=case)
list(qs)
#qs = Choice.objects.annotate(s=s)
#list(qs)
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/34858#comment:1>
Old description:
New description:
Tested on Django 4.2.4.
qs = Choice.objects.annotate(ss=case)
list(qs)
#qs = Choice.objects.annotate(s=s)
#list(qs)
}}}
On the other hand, it's a little strange that adding two
`PositiveIntegerField()` results in an output type of `IntegerField()`, so
perhaps that's a bug as well...
--
--
Ticket URL: <https://code.djangoproject.com/ticket/34858#comment:2>