How to make calculation inside annotate?

Question:

This one when I run generates error

qs = User.objects.annotate(days=(datetime.now() - F("created_at")).days)
AttributeError: 'CombinedExpression' object has no attribute 'days'

How can I make that calculation as an annotation

When I run this code, it wroks fine

qs = User.objects.annotate(days=(datetime.now() - F("created_at")))
Asked By: aiden

||

Answers:

This can be achieved with a combination of ExpressionWrapper, which tells django what the output field type should be, and ExtractDay which, well, extracts the day.

In this case, the output field is a timedelta object (i.e DurationField).
ExtractDay is just a DB-level function which the django ORM provides.

from django.db.models import DateTimeField, DurationField, ExpressionWrapper, F
from django.db.models.functions import ExtractDay

qs = User.objects.annotate(
    days=ExtractDay(
        ExpressionWrapper(
            datetime.now() - F("created_at"), output_field=DurationField()))
    )

Answered By: Tomer Ariel