簡體   English   中英

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()

我想獲取某項特定運動的時間表,在過去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)

這行不通,有人可以在這里幫我嗎。 謝謝。

您的代碼是正確的過濾方式(盡管您可以通過逗號分隔查找來合並兩個filter()方法)。

問題可能是您正在過濾以下內容:

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

因此,如果您沒有未來30天(或今天)內具有日期的實例,則將獲得一個空集。

可以肯定的是,您應該使用tz.now()而不是date.today() ,因為您可能具有USE_TZ = True (默認值)。 參見django文檔

另外,您必須反轉日期過濾器,因為您要搜索的是未來30天而不是過去的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM