• Home
  • Django
  • django queryset with calculated field

django queryset with calculated field

linkaiyi
Follow

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)
Object has 0 attachments

Was this article helpful?

This article is viewed 11 times!

Recent Viewed Articles

0 Comments

Leave a Comment

Support