Event. Она имеет две даты, от и до. Назовёт условно start и end.
Мне нужно отфильтровать ивенты начиная с сегодняшнего дня и до самого конца.
НО. ивент может содержать как период от-до, так и просто одну дату, а вторая будет None
Представим, что есть список ивентов 2 числа, 5 числа, 9 числа, 1-7 числа, 28 числа прошлого месяца до 5 числа этого месяца.
И в результате нужно получить картину по типу:
28 числа прошлого месяца до 5 числа этого месяца, 1-7 числа, 2, 5 числа, 9 числа
То есть если текущая дата попадает в промежуток, то она так же отображается где-то в начале
Ломаю голову, не понимаю как реализовать, кто-то сталкивался?
Давай еще разок. Есть события start end 06.28 07.05 07.02 None 07.05 None 07.09 None 07.01 07.07 07.05 07.09 Сегодня 07.02, что надо получить?
картина должна быть примерно такая: start end 06.28 07.05 07.01 07.07 07.02 None 07.05 None 07.05 07.09 07.09 None примерно это если встречается такое: 07.05 None 07.05 07.09 то порядок между ними не имеет значения
Так .order_by('start') нужен?
да, по сути нужно сортировать по start но нужно как-то учитывать и диапазоны если бы было просто поле start date, то я сделал бы что-то типа start_data__lte=today но такой вариант отсечёт варианты по типу start end 06.28 07.05
.filter(Q(end_date__gte=today) | Q(end_date=None),start_date__lte=today)
если я правильно понял (и я проверил на практике), оно фильтрует в принципе правильно, но launch_date__lte=days ищет дни раньше сегодняшнего, то есть исключает варианты будущих ивентов. То есть, если сегодня 07.02, то ивент 07.05-07.10 не попадёт в список :( Возможно ли как-то это исправить?
используются в фильтрах lte и gte?
да
покажи код который получился?
я твой же код использовал .filter(Q(end_date__gte=today) | Q(end_date=None),start_date__lte=today) пытался чуток переписать, но всё-равно выходит не то, что надо. Твой вариант наиболее близкий к нужному результату
start_date и end_date на своих местах? Не перепутаны?
Да, они точно на своих местах как я понял по логике кода: идёт фильтрация по условию, что end_date будет позже текущей даты либо = None (это правильно) а start_date должна быть раньше сегодняшней даты (потому что start_date__lte стоит)
lte и gte тут буква e - equal (равно)
Да, Longer Than or Equal
Давай прочитаем, что написано. .filter(Q(end_date__gte=today) | Q(end_date=None),start_date__lte=today) выбрать записи ЕСЛИ (ДатаОкончения>=Сегодня ИЛИ ДатаОкончания=None) И (ДатаНачала<=Сегодня). Получается есть Событие 07-07 и сегодня 07, то ДатаОкончения>=Сегодня - это True ДатаНачала<=Сегодня - это True Как мне кажется, всё должно работать.
я понял как работает твой алгоритм, он действительно работает так, как ты описал: выбрать записи ЕСЛИ (ДатаОкончения>=Сегодня ИЛИ ДатаОкончания=None) работает правильно, но это: И (ДатаНачала<=Сегодня) делает выборку ТОЛЬКО по тем записям, которые начинаются <= сегодняшнего дня. Но нужно сюда ещё и прибавить ивенты, которые начинаются ПОСЛЕ сегодняшнего дня. То есть, сегодня 2 июля и есть ивент, который начинается 5 июля (и в принципе нам не важно когда он заканчивается), так вот он должен быть в списке Спасибо за помощь, я уже додумался как надо Сделал вот так all_bounties = Bounty.objects.filter(period_date__gte=days, launch_date__lte=days) all_bounties = Bounty.objects.filter(Q(period_date__gte=days) | Q(period_date=None), launch_date__gt=days) | all_bounties all_bounties = all_bounties.order_by('launch_date')
Обсуждают сегодня