Django查询链接多个过滤器

时间:2019-02-13 17:51:30

标签: python django django-orm

这是我的日程表对象,

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 :(得分:3)

您的代码是正确的过滤方式(尽管您可以通过逗号分隔查找来合并两个filter()方法)。

问题可能是您现在要过滤:

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

因此,如果您没有未来30天(或今天)内具有日期的实例,则会得到一个空集。

答案 1 :(得分:1)

请确定,您应该使用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")

答案 2 :(得分:1)

您的链接过滤器看起来几乎是正确的,但是我想您已经过去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)