Filter object by calculating duration from start and end time

321 views
Skip to first unread message

Steven Nash

unread,
Jan 19, 2016, 1:01:36 PM1/19/16
to Django users
Hi,

Given an object such as:

class Entry(models.Model):
  start = models.TimeField()
  end = models.TimeField()

I'd like to be able to say something like:

Entry.objects.filter(F('end')-F('start')__gt=time_in_minutes)

Is there a way of doing this without implementing a separate duration field and having a setter for start and end update it?

Cheers,
Steve

Simon Charette

unread,
Jan 19, 2016, 1:52:06 PM1/19/16
to Django users
Hi Steve,

You can use annotate for this.

from datetime import timedelta

from django.db.models import DurationField, ExpressionWrapper, F

Entry.objects.annotate(
    duration
=ExpressionWrapper(
        F
('end') - F('start'), output_field=DurationField()
   
)
).filter(duration__gte=timedelta(minutes=time_in_minutes)


Cheers,
Simon

Xristos Xristoou

unread,
Jan 19, 2016, 2:08:23 PM1/19/16
to Django users
can used this and for the dates fields ?

Steven Nash

unread,
Jan 19, 2016, 2:59:57 PM1/19/16
to Django users
Hi Simon,

Thanks, I'll give that ago.

Cheers,

Steve

Simon Charette

unread,
Jan 19, 2016, 4:19:54 PM1/19/16
to Django users
Hi Steve,

It looks like it might only work on PostgreSQL unti this bug is fixed.

Simon

Steven Nash

unread,
Jan 19, 2016, 4:37:53 PM1/19/16
to django...@googlegroups.com
That's fine as am using Postgres on centos 7

Cheers
Steve 

Sent from my iPhone
--
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/django-users/xIP7hhp0WqQ/unsubscribe.
To unsubscribe from this group and all its topics, send an email to django-users...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/3bd1db8e-0b53-4b3b-b781-51e4cc8a687c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages