查询集过滤器使用 Case/When 作为模型字段,而不是字段值

Queryset filter using Case/When for Model field, not field value

我想合并两个查询集,或者更好的是,针对特定情况只使用 Case/When 语法创建一个查询集。

我在 documentation 中看到它可以用于查询集过滤,而不仅仅是注释,这正是我所需要的。但是,我想对模型字段本身使用 Case/When,而不是字段的值。

该项目是一个电子商务项目,我使用的是 django-oscar,所以这里的模型非常大 post。需要知道的是,篮子线是指产品,产品可以是父产品、子产品或独立产品。

这是我的代码:

self.in_stock_lines = basket.lines.filter(product__product_class__track_stock=True, is_customized=False)

事实是,如果购物篮线与子产品相关,我必须过滤的字段是 product__parent__product_class__track_stock,而如果它与独立产品(没有父产品)相关,它保持 product__product_class__track_stock 和我最初的查询集一样。

有办法吗?或者我别无选择,只能使用 itertools.chain() 组合两个查询集?

您可以为此使用 Q 个对象。

from django.db.models import Q

basket.lines.filter(
  Q(product_parent__isnull=True, product__product_class__track_stock=True) | 
  Q(product__parent__product_class__track_stock=True), is_customized=False)