Django Custom Month and Year Lookup

Everyone want to keep Django timezone support but sometimes you need to keep your SQL queries a way from timezone conversion especially if by default your application timezone is UTC. Django will do something like this CONVERT_TZ(`app_incident`.`datetime`, 'UTC', 'UTC')) and it will return Null if the timezone table is empty. Even that conversion is not even needed.

On my previous article, I explained how to manage this in case of date comparison http://clivern.com/django-custom-lookups/. Today, I was trying to do the same for month and year comparison and I created a new lookups.

from django.db.models import Lookup
from django.db.models.fields import DateField, DateTimeField


@DateField.register_lookup
@DateTimeField.register_lookup
class YearEqLookup(Lookup):
    lookup_name = 'year_c_eq'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)

        params = lhs_params + rhs_params
        return 'EXTRACT(YEAR FROM DATE(%s)) = EXTRACT(YEAR FROM DATE(%s))' % (lhs, rhs), params


@DateField.register_lookup
@DateTimeField.register_lookup
class MonthEqLookup(Lookup):
    lookup_name = 'month_c_eq'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)

        params = lhs_params + rhs_params
        return 'EXTRACT(MONTH FROM DATE(%s)) = EXTRACT(MONTH FROM DATE(%s))' % (lhs, rhs), params

Leave a comment.

Your email address will not be published. Required fields are marked *