【问题标题】:Django query chaining multiple filtersDjango 查询链接多个过滤器
【发布时间】:2019-02-13 17:51:29
【问题描述】:

这是我的日程对象,

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)

这不起作用,有人可以在这里帮助我。谢谢。

【问题讨论】:

  • “它不起作用”并没有告诉我们问题出在哪里。你得到了什么?出错了?
  • @dirkgroten 它获取了一个空集
  • 您现在正在获取从今天到今天 + 30(3 月 15 日)之间的日期,因此是未来的日期。那是你要的吗?你说你想要过去的约会。
  • 要调试此查询,请一次删除一个条件,然后检查您的查询集。这将帮助您确定哪些标准会过滤掉所有内容并留下空白集。同意@dirkgroten,您的问题可能是添加日期而不是减去日期。

标签: python django django-orm


【解决方案1】:

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

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

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

因此,如果您没有任何实例的日期在未来 30 天(或今天),您将得到一个空集。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-22
        • 2016-03-20
        • 2015-02-17
        • 1970-01-01
        • 2017-08-04
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 2019-02-09
        相关资源
        最近更新 更多