Django 查询链接多个过滤器
Django query chaining multiple filters
这是我的日程对象,
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()
I want to fetch the schedules for a specific sport, for the past 30
days for tournaments which have anything other than a 0.0 bias.
这是我的查询
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)
这行不通,谁能帮帮我。谢谢
您的代码是正确的过滤方式(尽管您可以通过逗号分隔查找来合并这两个 filter()
方法)。
问题可能是您现在正在筛选:
today() <= date <= today() + 30 days
因此,如果您没有任何日期在未来 30 天(或今天)内的实例,您将得到一个空集。
只是为了确定,您应该使用 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")
你的链接过滤器看起来几乎是正确的,但我猜你搞砸了过去 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)
这是我的日程对象,
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()
I want to fetch the schedules for a specific sport, for the past 30 days for tournaments which have anything other than a 0.0 bias.
这是我的查询
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)
这行不通,谁能帮帮我。谢谢
您的代码是正确的过滤方式(尽管您可以通过逗号分隔查找来合并这两个 filter()
方法)。
问题可能是您现在正在筛选:
today() <= date <= today() + 30 days
因此,如果您没有任何日期在未来 30 天(或今天)内的实例,您将得到一个空集。
只是为了确定,您应该使用 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")
你的链接过滤器看起来几乎是正确的,但我猜你搞砸了过去 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)