I'm trying to do a union of two querysets with shared fields.
This works:
fields = ['id', 'date_trans', 'total', 'allocated', 'balance']
qs1 = Order.objects.values_list(*fields)
qs2 = OnAccount.objects.values_list(*fields)
return qs1.union(qs2)
The Order
model has a CharField
called num_invoice
which I'd like to include as a field in the union. This field doesn't exist in the OnAccount
model so in order to include it in the values_list()
I'm using an annotation.
The annotation works fine but the union causes an error:
django.db.utils.ProgrammingError: UNION types character varying and date cannot be matched
Here's my annotation and the union that does not work:
from django.db.models import CharField, Values as V
from django.db.models.functions import Concat
fields = ['id', 'num_invoice', 'date_trans', 'total', 'allocated', 'balance']
qs1 = Order.objects.values_list(*fields)
qs2 = (
OnAccount.objects
.annotate(num_invoice=Concat(V('OA-'), 'id', output_field=CharField()))
.values_list(*fields)
)
return qs1.union(qs2)
Updated Info
>>> qs1.model._meta.get_field('num_invoice')
<django.db.models.fields.CharField: num_invoice>
>>> qs1.model._meta.get_field('date_trans')
<django.db.models.fields.DateField: date_trans>
>>> qs2.model._meta.get_field('date_trans')
<django.db.models.fields.DateField: date_trans>