【问题标题】:Django filter on combination using F使用 F 组合的 Django 过滤器
【发布时间】:2021-06-24 18:18:21
【问题描述】:

我使用 Django ORM 编写了以下查询:

fixtures = Fixture.objects.filter(league=league).filter((Q(predictions__value__gt=0.0) & Q(predictions__team=F("home"))) & (Q(predictions__value__gt=0.0) & Q(predictions__team=F("away"))))

通过这个,我试图过滤掉主队的prediction__value 大于0.0 和客队的prediction__value 大于0.0 的每个灯具。

遗憾的是,我的查询在使用 .count() 时返回 0 条记录,而它应该返回几乎所有记录。

当我只使用查询的一部分时;所以无论是 home 部分还是 away 部分,查询都会返回一定数量的记录。

模型:

class Fixture(models.Model):        
    home = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="home")
    away = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="away")

    league = models.ForeignKey(League, on_delete=models.CASCADE, blank=True)

class Prediction(models.Model):
    fixture = models.ForeignKey(Fixture, on_delete=models.CASCADE, related_name="modelx_predictions")
    team = models.ForeignKey(Team, on_delete=models.CASCADE)
    model = models.ForeignKey(Model, on_delete=models.CASCADE, related_name="modelx_predictions")

    value = models.FloatField(default=None, null=True, blank=True)

联赛的价值在这里无关紧要。

【问题讨论】:

  • 您能指定您的模型并描述您的目标吗?
  • @WillemVanOnsem 添加了模型,我已经在第一段中指定了我要做什么

标签: python django


【解决方案1】:

您应该使用两个外部 JOIN 进行过滤,因此:

fixtures = Fixture.objects.filter(league=league).filter(
    predictions__value__gt=0.0, predictions__team=F('home')
).filter(
    predictions__value__gt=0.0, predictions__team=F('away')
)

这将因此在给定的fixture 中寻找Predictions,其中一个预测来自home 团队并且其值大于0,而来自away 团队的预测更大比0.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2017-03-28
    • 1970-01-01
    • 2020-01-30
    • 2020-06-21
    相关资源
    最近更新 更多