models, peeking to next record - maybe

25 views
Skip to first unread message

Richard Bowden

unread,
Feb 7, 2015, 5:40:18 PM2/7/15
to django...@googlegroups.com
Got an problem that I am struggling to solve..

I have:

class Address(models.Model):
name = models.CharField()
event_date = models.DateTime()


event1, 25/01/2015
event2, 27/01/2015
event3, 05/02/2015

and so on…

what I am trying to figure out is, how to calculate the days between each event.

so event2, would be 2 days, event3 would be 9 days etc.

want to end up with something like this that is passed to the template
event1, 25/01/2015
event2, 27/01/2015, 2
event3, 05/02/2015, 9


its the mechanics I am having trouble working out, my initial though was to have a def on the model that accepted a datetime object. Somehow in a loop i would get the diatomite from the next event and pass it in and calc days on self.event_date… cant think how to do it.

has anyone else needed something like this? or am I thinking about it wrong..

Thanks

Lachlan Musicman

unread,
Feb 7, 2015, 8:02:23 PM2/7/15
to django...@googlegroups.com
My initial suggestion would be to utilise the "order by" option, and
order by date.

Then, on each model have a find_next function and a until_next function.

The first would work out which was the next event, the other the time.
They could be coupled, but keeping them separate means you can utilise
them later if you need to.

cheers
L.
------
"This is a profound psychological violence here. How can one even
begin to speak of dignity in labor when one secretly feels one's job
should not exist?"

On the Phenomenon of Bullshit Jobs, David Graeber
http://strikemag.org/bullshit-jobs/
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to django-users...@googlegroups.com.
> To post to this group, send email to django...@googlegroups.com.
> Visit this group at http://groups.google.com/group/django-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/63b0691e-34b1-4634-bf29-640583f22bae%40googlegroups.com.
>
> For more options, visit https://groups.google.com/d/optout.

Vijay Khemlani

unread,
Feb 7, 2015, 8:05:43 PM2/7/15
to django...@googlegroups.com
The direct solution would be something like this in your view

events = Event.objects.order_by('event_date')

event_tuples = []
last_date_seen = None

for event in events:
    if last_date_seen:
        date_difference = event.date - last_date_seen
    else:
        date_difference = None

    event_tuples.push((event, date_difference))

(date_difference would be a timedelta object)

Thomas Rega

unread,
Feb 8, 2015, 5:55:24 AM2/8/15
to django...@googlegroups.com

Tim Chase

unread,
Feb 9, 2015, 10:45:52 PM2/9/15
to django...@googlegroups.com, vkhe...@gmail.com
On 2015-02-07 22:05, Vijay Khemlani wrote:
> The direct solution would be something like this in your view
>
> events = Event.objects.order_by('event_date')
>
> event_tuples = []
> last_date_seen = None
>
> for event in events:
> if last_date_seen:
> date_difference = event.date - last_date_seen
> else:
> date_difference = None
>
> event_tuples.push((event, date_difference))

In the past I've created something like this as a filter, which lets
it be fairly generic. I also make it a generator rather than keeping
them all around. Something like (I don't have the exact code on hand)

from django import template
register = template.base.Library()
@register.filter(name="pairwise")
def pairwise(iterable, final=True):
i = iter(iterable)
a = next(i)
for b in i:
yield a, b
a = b
if final:
yield a, None

-tkc



Reply all
Reply to author
Forward
0 new messages