Django-запрос объединяет несколько фильтров - PullRequest
0 голосов
/ 13 февраля 2019

Это мой объект расписания,

class Schedule(Base):
    tournament = models.ForeignKey(Tournament, on_delete=models.CASCADE, null=True)
    first_team = models.ForeignKey(Team, related_name="first_team", on_delete=models.CASCADE, null=True)
    second_team = models.ForeignKey(Team, related_name="second_team", on_delete=models.CASCADE, null=True)
    first_score = models.IntegerField(default=0, null=True)
    second_score = models.IntegerField(default=0, null=True)
    sport = models.ForeignKey(Sport, on_delete=models.CASCADE, null=True)
    date = models.DateTimeField()

Я хочу получить расписания для определенного вида спорта за последние 30 дней для турниров, которые имеют что-либо кроме смещения 0,0.

Это мой запрос

schedules = Schedule.objects.filter(sport=sport).filter(date__gte=date.today()).filter(
                        date__lte=(date.today() + timedelta(days=30))).order_by("date").exclude(tournament__bias=0.0)

Это не работает, может кто-нибудь помочь мне здесь.Спасибо.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Просто чтобы быть уверенным, вы должны использовать tz.now() вместо date.today(), потому что у вас, вероятно, USE_TZ = True (значение по умолчанию).См. django docs .

Кроме того, вам необходимо инвертировать фильтры даты, потому что вы ищете 30 дней в будущем, а не в прошлом.

import datetime
from django.utils import timezone as tz

today = tz.localtime(tz.now()).date()
start_date = today - datetime.timedelta(days=30)
end_date = today

schedules = Schedule.objects.exclude(tournament__bias=0.0) \
    .filter(sport=sport, date__gte=start_date, date__lte=end_date) \
    .order_by("date")
0 голосов
/ 13 февраля 2019

Ваш фильтр цепочки выглядит почти правильно, но я думаю, что вы возитесь с фильтрацией разделов за последние 30 дней.

schedules = Schedule.objects.filter(sport=sport).filter(date__lt=date.today()).filter(
                        date__gte=(date.today() - timedelta(days=30))).order_by("date").exclude(tournament__bias=0.0)
0 голосов
/ 13 февраля 2019

Ваш код является правильным способом фильтрации (хотя вы можете объединить два метода filter() путем разделения запятых поисков).

Возможно, проблема в том, что вы сейчас фильтруете:

today() <= date <= today() + 30 days 

Так что, если у вас нет экземпляров с датой в ближайшие 30 дней (или сегодня), вы получите пустой набор.

...