convert datefield / datetimefield to string
use cast to cast the field to Charfield()
from django.db.models import F, Func, Value, CharField
from django.db.models.functions import Cast
dataset = qs_personal.annotate(month=Cast('natural_calendar_date', CharField())).values(
'month', 'partner_code', 'partner_name', 'product_code', 'product_name', 'product_area').annotate(
sales=Sum('amount'), target=Sum('target_amount'))
use database specific function
from django.db.models import F, Func, Value, CharField
from django.db.models.functions import Cast
qs.annotate(
formatted_date=Func(
F('date'),
Value('dd.MM.yyyy hh:mm'),
function='to_char',
output_field=CharField()
)
) # postgresql
qs.annotate(
formatted_date=Func(
F('date'),
Value('dd.MM.yyyy hh:mm'),
function='DATE',
output_field=CharField()
)
) # sqlite
qs.annotate(
formatted_date=Func(
F('date'),
Value('dd.MM.yyyy hh:mm'),
function='DATE_FORMAT',
output_field=CharField()
)
) # mysql
convert datatime field to string in queryset with cast and trunc
# truncsecond means all seconds are set to 00
# truncmonth means all days are 01
foo_bar = FooBarModel.objects.annotate(
str_datetime=Cast(
TruncSecond('some_datetime_field', DateTimeField()), CharField()
)
).values('str_datetime').first()
## use more annotate
from django.db.models import Value
foo_bar = FooBarModel.objects.annotate(
day=Cast(ExtractDay('some_datetime_field'), CharField()),
hour=Cast(ExtractHour('some_datetime_field'), CharField()),
str_datetime=Concat(
Value('Days: '), 'day', Value(' Hours: '), 'hour',
output_field=CharField()
)
).values('str_datetime').first()
## use extra fields
qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%Y-%m-%d')"})
qs = qs.values_list('datestr')
check database type
# db_name = settings.DATABASES['default']['ENGINE'].split('.')[-1]
# print(db_name)