【问题标题】:Django Filter based on 2 fields基于 2 个字段的 Django 过滤器
【发布时间】:2021-11-28 06:52:14
【问题描述】:

我有一个可以设置 expire_date_1 和 expire_date_2 的模型。还有 2 个这样的过滤器。

filter_1 = Q(expire_date_1__isnull=False) & Q(expire_date_1__lte=after_30days) 
filter_2 = Q(expire_date_2__isnull=False) & Q(expire_date_2__lte=after_30days)

我想过滤模型,如果 expire_date_2 不为空,则使用 filter_2 否则使用 filter_1 我尝试将它与 Case 和 When 一起使用,但我无法在 When 函数中进行过滤,可以吗?

【问题讨论】:

  • 注意:Case 也适用于过滤器(文档中有)。

标签: python django django-orm


【解决方案1】:

您可以使用Coalesce [Django-doc] 来确定要使用的字段:

from django.db.models import Coalesce

MyModel.objects.alias(
    exp_date=Coalesce('expire_date_2', 'expire_date_1')
).filter(
    exp_date__lte=after_30_days
)

或在.annotate(…) 之前:

from django.db.models import Coalesce

MyModel.objects.annotate(
    exp_date=Coalesce('expire_date_2', 'expire_date_1')
).filter(
    exp_date__lte=after_30_days
)

【讨论】:

  • 非常感谢 Willem Van Onsem !你救了我的一天!我用2个不同的方式更新了它。 “从 django.db.models.functions 导入 Coalesce” - 可能是因为我的 django 是 2.2 并且“..exp_date=Coalesce('expire_date_2', 'expire_date_1')..” - 我想优先考虑“expire_date_2”
  • @RyanTran: aaarrrgghh 是的,你需要交换参数。感谢更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 2014-11-27
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多