【问题标题】:Django ORM compound filter with variables带有变量的 Django ORM 复合过滤器
【发布时间】:2016-11-30 22:22:44
【问题描述】:

我绝不是 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 天的流感编码中煎炸了。

【问题讨论】:

  • 我可以帮助你,但我不会说 .NET 并且从你的文字中我无法弄清楚伪代码的哪些部分实际上是模型字段,哪些只是变量......我可以假设 annualIncomepayment 是 int/float 变量,monthlyIncome 是要过滤的 DB 字段?
  • annualIncome 和 payment 是模型字段,monthlyIncome 是一个变量。

标签: python django postgresql django-orm


【解决方案1】:

在这种情况下,欢迎来到 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)

【讨论】:

  • 我完全明白了。再次感谢@makaveli - 这正是我想要的。
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 2021-10-01
  • 2019-11-01
  • 2021-07-22
  • 1970-01-01
  • 2020-02-16
  • 2013-10-18
  • 2019-01-02
相关资源
最近更新 更多