带变量的 Django ORM 复合过滤器

Django ORM compound filter with variables

我绝不是 Django 专家,需要一些问题的指导。

作为背景,我有一个较旧的 .NET 项目,我的任务是将其转变为 Django 项目。该项目获得 object 的完整列表,然后运行大量用户集过滤器以最终得到所需的 object 集。

.NET 中的一个过滤器可能是这样的...

matched.RemoveAll(x => ((x.annualIncome / 12) - x.payment) < monthlyIncome);

我正在尝试弄清楚如何使用 django ORM 执行此操作。我有点坚持这一点。

在 pseudo-code django ORM 版本中(是的,这行不通):

matched.exclude(((annualIncome /12)-payment)__gt = monthlyIncome)

在此之前有 30 多个过滤器,所以我无法 re-do 以不同的方式全部使用它们。我显然可以通过每个 object 和过滤,但我决定先问。

我愿意接受这里或友好的解决方案"RTFM, this pages answers it."

在此先感谢,mods 请编辑一个更好的标题,因为我的大脑现在已经从 3 天的流感编码中正式炸毁了。

在这种情况下,欢迎来到 Django ORM 的神奇世界(从某种意义上说,它实际上在大多数时候都非常合理:)。

from django.db.models import F, Case

# Your stuff
matches.annotate(
    req=Case(default=(F('annualIncome') / 12) - F('payment'))
).exclude(req__gt=monthlyIncome)

因为在那种计算中不能直接查询,所以F对象告诉ORM这个应该是从数据库中来的,去拿吧
未经测试(由于我的项目中没有类似案例),但如果出现问题,请告诉我。

PS。您可以将 req 名称更改为任何您喜欢的名称。

编辑:
哇,这很尴尬。您也可以在没有 Case 的情况下执行此操作。

matches.annotate(req=(F('annualIncome') / 12) - F('payment')).exclude(req__gt=monthlyIncome)