我绝不是Django专家,需要一些问题的指导。
对于后台,我有一个较旧的.NET项目,我的任务是变成Django项目。项目获取完整的对象列表,然后运行一大组用户设置过滤器,最终得到所需的对象集。
.NET中的一个过滤器可能就是这样......
matched.RemoveAll(x => ((x.annualIncome / 12) - x.payment) < monthlyIncome);
我正在试图弄清楚如何用django ORM做到这一点。我很不高兴。
在伪代码django ORM版本中(是的,这不起作用):
matched.exclude(((annualIncome /12)-payment)__gt = monthlyIncome)
在此之前有30多个过滤器,所以我不能以不同的方式重新完成它们。我显然可以浏览每个对象并过滤但我决定先询问。
我愿意接受这里的解决方案或友好的“RTFM,这个网页会回答它。”
在此先感谢,并且mods请用更好的标题进行编辑,因为我的大脑现在正在使用流感进行3天编码。
答案 0 :(得分:0)
在这种情况下,欢迎来到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)