2015-04-21 2 views
0

Я пытаюсь использовать latest() в наборе запросов django, чтобы вернуть следующую датируемую дату в модели.Следующая дата объекта модели объекта, игнорирующего прошлые даты

Я пробовал несколько разных вещей, используя __lte и __gte поисковые запросы на фильтр и безрезультатно.

Опция фильтра будет работать для меня, если бы был способ эффективно использовать метод модели в пределах exclude(), но без написания пользовательского менеджера, который не будет вариантом.

Должен быть более простой способ?

class RaidSession(models.Model): 
    scheduled = models.DateTimeField() 
    duration = models.DurationField() 

    def is_expired(self): 
     duration_to_date = self.scheduled + self.duration 
     return True if duration_to_date < timezone.now() else False 
+0

Не могли бы вы пост попытайтесь с помощью 'filter'? – BlackVegetable

+1

Позвольте мне попытаться перефразировать ваше требование: вам нужен первый объект модели в списке, отсортированном по дате, отфильтрованной объектами позже текущей даты плюс некоторая продолжительность из соответствующего поля модели? – dhke

+0

@ dhke продолжительность этого набора запросов не имеет значения. Только запланированное дата-время однажды .now() позже этого поля. –

ответ

1

Поскольку я немного старая школа, это обычно помогает мне думать о таких проблемах, как SQL-запрос. В вашем случае это будет

SELECT * FROM app_raidsession rs 
    WHERE rs.scheduled >= now() 
    ORDER BY rs.scheduled 
    LIMIT 1 

Это дает вам следующий запланированный рейд.

В Джанго ОРМ, вы должны быть в состоянии перевести это более или менее просто, чтобы:

from django.utils.timezone import now 

# first() returns None if the result is empty 
next_raid = models.RaidSession.objects \ 
    .filter(scheduled__gte=now()) \ 
    .order_by('scheduled') \ 
    .first() 

Если длительность актуальна, вам нужно будет F-expression:

from django.db.models import F 

next_raid = models.RaidSession.objects \ 
    .filter(scheduled__gte=now() - F('duration')) \ 
    .order_by('scheduled') \ 
    .first() 
+0

Красиво сделано, мне нравится, как вы анализировали его в SQL, в первую очередь, удобный инструмент для отладки. (PS '.filter (schedule__gte == now())' должно быть только одно = :). Это работает. –

+0

Nah, хотя я уже отредактировал этот двойной '==' out. Исправлено, спасибо. – dhke

Смежные вопросы