带变量的 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)
我绝不是 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)